在js中有三种办法改变this的调用指向,ccall、apply、bind
一、call方法
1.原理:根据隐式的绑定规则obj.fn 当中的this指向的就是obj,那么我们只需要在调用call 方法时候,将当前的this赋值给要改变的对象身上,那么this的指向就根据隐式规则,绑定到了新的对象上,从而达到改变this指向的问题。
2.语法:function.call(thisArg, arg1, arg2, …)
3.仿写demo
//es5 写法
Function.prototype.es5Call = function (){
var rst = null, //定义一个对象
obj = arguments[0] || window, //拿到第一个参数
len = arguments.length, //拿到arguments长度
argArr = []; // 需要的参数数组
//组合传递过来的参数 'arguments[' + i + ']' ==>'arguments[1]
for (let i = 1; i < len; i++) {
argArr.push('arguments[' + i + ']');
//这里也可以用reduce的思想,但是用reduce会用到Array原型上的call方法,故而放弃。
}
//保存this 当前this 指定的是 call前一个函数
obj.targetFunc = this;
//利用eval当函数和参数互相组合
rst = eval('obj.targetFunc(' + argArr.join() + ')');
//删除原函数obj.targetFunc
delete obj.targetFunc;
return rst;
}
// es6写法
Function.prototype.es6Call = function (){
var rst= null,
obj = arguments[0] || window, //拿到第一个参数
args = [...arguments].slice(1); //去掉第一个参数
obj.targetFunc = this; //将调用者绑在这个参数身上
rst = obj.targetFunc(...args) //this绑定本质谁调用指向谁。
delete obj.targetFunc
return rst
}