javascript中call函数的原理、手写call函数

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函数。

你可能感兴趣的:(javascript中call函数的原理、手写call函数)