【问题标题】:What is a difference between Array.prototype.forEach.call vs Array.prototype.forEachArray.prototype.forEach.call 与 Array.prototype.forEach 有什么区别
【发布时间】:2014-09-12 06:17:50
【问题描述】:

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

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

【问题讨论】:

  • 您是否尝试将其与类似数组的对象一起使用?比如nodelist等?
  • @slebetman: Yes

标签: javascript


【解决方案1】:

确实有效,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}

【讨论】:

    【解决方案2】:

    说明

    它已经在documentation 中(重点是我的):

    15.4.4.18 Array.prototype.forEach ( callbackfn [ , thisArg ] )

    callbackfn 应该是一个接受三个参数的函数。 forEach 调用 callbackfn 一次 数组,按升序排列。 callbackfn 仅针对以下元素调用 实际存在的数组;不需要缺少元素 数组。

    如果提供了thisArg参数,它将被用作this 每次调用 callbackfn 的值。如果没有提供, 改为使用undefined

    thisArg 仅用于callbackfn 的调用。但是,它不用于为forEach 提供this 值,其中this 需要是一个类似数组的结构(这意味着它具有length 属性)。如果你使用Array.prototype.forEach(..., someObject)thisforEach 的上下文中的值将是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]"
    

    【讨论】:

    • 我希望你不要使用&gt;&gt;&gt;。今年第一次见。很多谷歌搜索,仍然在黑暗中。这里的目的是什么?...
    • 如果在下面没有答案,我会永远感到困惑,但它让我走上了正轨,而你的让我领先。谢谢你们。
    • 如果其他人发现这个,&gt;&gt;&gt; 是零填充右移 (JS operators reference)。在这种情况下,它被用作一种更紧凑(但更令人困惑)的方式来表示Number(this.length),将this.length 转换为一个数字,以防它恰好是一个字符串。
    • @ecraig12345:它还强制它为无符号整数,而Number 可以产生双精度值。这是原始步骤“让 len 成为 ToUint32(lenValue)”的逐字翻译。
    猜你喜欢
    • 2017-09-30
    • 1970-01-01
    • 2011-02-19
    • 2013-03-14
    • 2018-09-14
    • 2014-01-03
    • 2021-12-22
    • 2017-10-25
    • 2011-06-09
    相关资源
    最近更新 更多