我已经调整了一个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));
});
答案 0 :(得分:1)
Function.call方法有它的第一个参数 - 上下文 - 可选,那么为什么必须在这种情况下将上下文作为第一个参数传递?
因为.call()
是一个可变函数;它接受一个未知数量的参数,因此任何固定的参数(或与其他参数具有不同语义的参数)都放在前面。
指定undefined
或null
作为第一个参数将替换您使用全局对象调用的函数内的this
(在non-strict模式下)。