【问题标题】:Javascript array.forEach Scope?Javascript array.forEach 范围?
【发布时间】:2015-03-09 22:31:06
【问题描述】:

第 9 行的 console.log 显示

{ '计数' : 1111111 , '平均' : 2222222 , '总计' : 3333333 }

对于所有 3 个数组元素,即使进行这些更改的循环尚未运行。这怎么可能?

function test11(){

    var test = [
        { 'count' : 1 , 'average' : 2 , 'total' : 3 } ,
        { 'count' : 10 , 'average' : 20 , 'total' : 30 } , 
        { 'count' : 100 , 'average' : 200 , 'total' : 300 }
    ] ; 

    console.log( test ) ; 

    test.forEach( function( element , service_index , array ){

        array[ service_index ].count = 1111111 ;
        array[ service_index ].average = 2222222 ;
        array[ service_index ].total = 3333333 ;

    });

    console.log( test ) ;

    return ; 

}

这是代码 http://jsfiddle.net/d46wh2cv/7/ 的 jsfiddle。

我在以下位置阅读了规格:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

但我看不出这种反直觉行为的任何解释。

我正在使用 Google chrome 39.0.2171.95 运行 Debian Linux,并且在 Iceweasel 24.5.0 中也有相同的结果。

感谢您的帮助。

【问题讨论】:

标签: javascript arrays foreach scope


【解决方案1】:

您正在记录对一个对象的引用(因为 Arrays 是全局 Array 对象的一个​​实例)。

你说得对,在日志行时循环还没有运行,但这没关系。 当您检查它时,这些值已经发生了变化(因为循环可能需要 2 或 3 毫秒才能运行)。

尝试只记录test[0].count 而不是整个对象。

【讨论】:

  • jsbin.com/bopidetubi/1/edit?html,css,js,console,output 向我显示 bin 控制台的正确输出,每当 chrome 记录器由于 rockerest 提到的原因向我显示错误的输出时
  • jsfiddle.net/d46wh2cv/8 做到了。我认为它必须是基于浏览器的东西,但这非常糟糕。我应该在那里添加超时或其他东西吗? SMH。该问题出现在功能代码中,现在我担心用户系统的高速度会影响我在嵌套循环中所做的更改,从而导致意外结果。这太可怕了。
  • @JordanReddick 我不确定你的意思。但是,如果我知道您想在数据更改之前查看数据,您可以执行console.log( JSON.stringify( test ) ); 之类的操作。此外,如果没有返回任何内容,则不需要从函数中 return ;
  • @JordanReddick,这是非常典型的引用行为。对象在 Javascript 中通过引用传递。因此,当您记录对象时,它会记录指针指向的任何内容。如果该参考发生变化,您看到的结果也会发生变化。我希望这对您来说并不可怕,因为它实际上是该语言(以及许多其他通过引用传递的语言)的强大功能。
  • 哦 - 所以你说它只是滞后的控制台?该变量在该行保存正确的值。在我的代码中,我在循环中的每个循环后将值重置为 0。如果我在循环内记录精确值,它会显示 0,但如果我在完成循环后立即记录整个对象,它会显示直到代码稍后才应该设置的值。如果未重置实际数字,这将导致可能看起来有效的不良结果。如果只是日志记录很慢 - 我可以忍受。
猜你喜欢
  • 2013-06-09
  • 2011-06-23
  • 2013-10-23
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 2012-05-21
相关资源
最近更新 更多