.call方法的1-st参数的“可选”含义

时间:2014-07-20 21:17:37

标签: javascript

我已经调整了一个Javascript Ninja书的代码示例(列出6.9),使其更短。这段代码片段是关于向Array.prototype添加forEach方法(我将其重命名为fooEach以避免混淆)。现在的问题是:为什么我们需要传递(context || null)作为第一个参数(代码示例中为null)? Function.call方法有它的第一个参数 - 上下文 - 可选,那么为什么必须在这种情况下将上下文作为第一个参数传递?

if (!Array.prototype.fooEach) {                                
    Array.prototype.fooEach = function(callback, context) {      
        for (var i = 0; i < this.length; i++) {
            callback.call(context || null, this[i], i, this);       
        }
    };
}
["a", "b", "c"].fooEach(function(value, index, array) {        
    console.log(value + " is in position " + index + " out of " + (array.length - 1));
});

1 个答案:

答案 0 :(得分:1)

  

Function.call方法有它的第一个参数 - 上下文 - 可选,那么为什么必须在这种情况下将上下文作为第一个参数传递?

因为.call()是一个可变函数;它接受一个未知数量的参数,因此任何固定的参数(或与其他参数具有不同语义的参数)都放在前面。

指定undefinednull作为第一个参数将替换您使用全局对象调用的函数内的this(在non-strict模式下)。