call
函数是用来改变调用者的this
指针:
function f() {
console.log(this)
}
f() // window
let obj = { a: 1 }
f.call(obj) // { a: 1 }
f.call(obj)
的原理就是把f
函数挂载到obj
上,执行obj.f()
的时候,f
中的this
就指向了obj
。根据这个原理, 我们可以来实现自己的 myCall
函数 :
Function.prototype.myCall = function (obj) {
var obj = obj ? Object(obj) : window // obj可能不是一个对象 所以用Object()包裹下
obj.fn = this // 当执行 f.myCall() 时, myCall()里的 this 指向 f
var arg = [...arguments].slice(1) //取出除了obj以外的其他参数
var result = obj.fn(...arg)
return result
}
其中比较难理解的就是 obj.fn = this
, 这行代码的意思就是把f.call(obj)
中的f
函数挂载到obj
上。当执行f.myCall()
时, myCall
里的 this
指向 调用者f
,所以这里的this
就是f
函数。
网友评论