纠结的函数调用

今天看到一段代码,把call和apply一起调用,让我琢磨的大半天:

function Foo() {}

Foo.prototype.method = function(a, b, c) {
    console.log(this, a, b, c);
};

// Create an unbound version of "method" 
// 输入参数为: this, arg1, arg2...argN
Foo.method2 = function() {

    // 结果: Foo.prototype.method.call(this, arg1, arg2... argN)
    Function.call.apply(Foo.prototype.method, arguments);
};

//上面的Foo.method2 等效于下面的代码:

Foo.method2 = function() {

    var args = Array.prototype.slice.call(arguments);
    Foo.prototype.method.apply(args[0], args.slice(1));
};


//example:
      Foo.method2({"a":33},1,2,3)
// output: Object { a=33} 1 2 3
// 可以看到: this指向了 对象 {"a":33},而剩下的参数正好传递给method了。

   结论:
       1. apply方法,会自动把arguments这个伪数组,解构,传递给 call方法。
       2. 我们知道,call的调用方法是:fn.call(obj,args1,args2,...),而 Foo.prototype.method 将会利用call方法得到执行。
       3.传递给 Foo.method2 的 arguments[0],相当于call参数的 obj,而 arguments的后续参数,将逐个按次序,传递给 Foo.prototype.method

相关推荐