手写一个 call

解释 call 的作用:call 用于绑定函数中的 this,并且立即执行。与 apply 类似,区别在于:

  • fn.call(context, arg1, arg2, ...)
  • fn.apply(context, [arg1, arg2, ...])

call 接受参数列表,而 apply 接受参数数组

JavaScript
var a = 'global scope'
function fn(param1, param2) {
    console.log(this.a, param1, param2)
}


var obj = {
    a: 'obj scope',
}
fn.call(obj, 1, 2) // => "obj scope" 1 2

手写

JavaScript
1
2
3
4
5
6
Function.prototype.myCall = function (context, ...args) {
    context._fn = this
    var result = context._fn(...args)
    delete context._fn
    return result
} 

解释:在 Function 原型上挂的方法 myCall 中,this 指向函数本身。把函数挂到上下文对象 context 中,并且通过 context._fn 的方法执行该函数,可以改变函数的 this 指向。最后,删除函数的引用。

测试:

JavaScript
fn.myCall(obj, 1, 2) // => "obj scope" 1 2