根据MDN的文档,如果像https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach这样调用,你可以为forEach函数提供这个参数,但它不起作用。如果我使用call
,它就有效。
据我所知,call和apply用于提供this
和函数参数。但是,应该没有必要。那我错过了什么?
答案 0 :(得分:3)
它确实有效,forEach
的第二个参数为回调提供了上下文
var numbers = [1,2,3,4];
var sum = {value: 0};
numbers.forEach(function(num){
this.value += num;
}, sum);
console.log(sum); // Object {value: 10}
答案 1 :(得分:1)
它已经在documentation(强调我的):
15.4.4.18
Array.prototype.forEach ( callbackfn [ , thisArg ] )
callbackfn
应该是一个接受三个参数的函数。forEach
为每个元素调用callbackfn
一次 数组,按升序排列。callbackfn
仅针对元素调用 实际存在的数组;没有要求缺少元素 数组。如果提供了
thisArg
参数,则会将其用作this
每次调用callbackfn
的值。如果没有提供, 而是使用undefined
。
thisArg
仅用于callbackfn
的调用。但是,它不用于为this
提供forEach
值,其中this
需要是类似数组的数组(这意味着它有length
属性)。如果您使用Array.prototype.forEach(..., someObject)
,this
上下文中的forEach
值将为undefined
。
forEach
版本(立即显示问题)function forEach( callback , thisArg ){
// The algorithm parses the length as UInt32, see step 3.
// >>> not only acts as bit shift, but also forces the
// value into an unsigned number.
var len = this.length >>> 0, // using "this", not "thisArg"!
i;
for(i = 0; i < len; ++i){
callback.call(thisArg, this[i]);
// thisArg ^^^^^^^^^ is used here, not up at length
}
}
// example calls:
var logArguments = function(args){
console.log(args, this);
}
forEach(logArguments, [1,2,3]); // logs nothing
forEach.call([1,2,3], logArguments); // logs 1, 2, 3
forEach.call([1,2,3], logArguments, [2,3,4]); // logs "1 Array [2,3,4]"
// "2 Array [2,3,4]"
// "3 Array [2,3,4]"