Array.prototype.forEach.call与Array.prototype.forEach有什么区别?

时间:2014-09-12 06:17:51

标签: javascript

根据MDN的文档,如果像https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach这样调用,你可以为forEach函数提供这个参数,但它不起作用。如果我使用call,它就有效。

据我所知,call和apply用于提供this和函数参数。但是,应该没有必要。那我错过了什么?

2 个答案:

答案 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]"