对于call()的使用,用于修改指针方法,同时可以传递参数给调用的函数
改变this指向,传参数给fn,返回fn值
例如:fn(a,参数。。。)
分析:
- a如果是undefined或者null,this指向window
- call接受的第一个参数是改变this的指向,后面传参(首先进行判断)
- 为了让内部this指向当前参数(给传的参数设一个属性是被调用的函数)(关键)
- 设置属性后进行调用,返回
function fn() {
console.log(this);
return "goodbay"
}
Function.prototype.call = function (target, ...rest) {
//判断target类型
if (target === undefined || target === null) {
target = window;
}
if (typeof target !== 'object' && typeof target !== 'function' && target !== undefined) {
target = Object(target)
}
//给targrt扩展一个新属性,属性值就是被调用的函数(this)
target.fn = this; //target.fn=fn
//调用函数,内部this自然指向target target是fn函数,
const re = target.fn(...rest);//三个点张开数组
console.log("rest"+rest);
//使用完毕删除
delete target.fn;
//返回值就是调函数的返回值
return re;
}
此时有一些容易混淆的点
target.fn=this
此时this指向fn,举一个例子方便理解
Function.prototype.call = function (a) {
console.log(this);//此时讨论一下此处this的指向
}
function fn() {
}
fn.call(2)
//==>
fn.call(function(e){
console.log(this);
})
const re =target.fn(...rest)
const re = target.fn(...rest)//相当于===>target.fn(...rest)=fn(...rest)