【问题标题】:jquery $.each vs for loop (with async content)jquery $.each vs for 循环(带有异步内容)
【发布时间】:2015-10-28 15:30:12
【问题描述】:

两者的主要区别是什么:

    var test=[5,6,7,8,9];
    $.each(test, function (i, num) {
        setTimeout(function(){console.log('i: '+i+'  '+num)},500);
    });
    for (var j = 0; j < test.length; j++) {
        setTimeout(function(){console.log('j: '+j+'  '+test[j])},500);
    }

第一个循环输出:

i: 0  5
i: 1  6
i: 2  7
i: 3  8
i: 4  9

第二个循环输出:

5次'j: 5 undefined'

我明白为什么第二个循环会这样做,但不明白为什么 $.each 会“按预期”工作

谢谢!

【问题讨论】:

  • 如果您知道第二个循环为什么会这样,那么您应该知道它与第一个循环有何不同。那么,有什么区别呢?第二个循环有什么问题?
  • 第二个例子不起作用,因为有一个闭包。第一个示例通过为每次迭代创建一个函数来解决这个问题(从而创建一个新范围)
  • @ValentinS.:为防止任何误解:第一个示例中仍然存在闭包。
  • 是的。我道歉。实际上,第一个示例并没有以不创建闭包的方式进行修复,而是以避免闭包的影响的方式进行了修复。

标签: javascript jquery loops asynchronous


【解决方案1】:

在幕后的第一个 sn-p 中,每次迭代都会调用您提供的回调。这意味着,在内部它将为每次迭代创建一个范围。这最终会成为一个 cloure。

但是在第二个 sn-p 中。触发超时回调时将使用初始范围。所以它正在显示该输出。您可以使用以下代码使其工作,

for (var j = 0;j<test.length-1;j++) {
 var scope = function(i) { 
  setTimeout(function(){console.log('j: '+i+'  '+test[i])},500);
 };
 scope(j);
}

【讨论】:

  • 谢谢,解决了,我实际上在for循环中有ajax调用,所以我使用了自执行匿名函数for (var j = 0; j &lt; test.length; j++) { (function(j){ setTimeout(function(){console.log('j: '+j+' '+test[j])},500); }(j)); }
猜你喜欢
  • 2014-10-19
  • 2013-01-26
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
相关资源
最近更新 更多