setInterval()的奇怪逻辑

时间:2014-08-25 14:09:19

标签: javascript

我是新手学习javascript并遇到我不理解的奇怪行为

所以这打印正是我所期望的。 0,1,2,3,4

var numberOfPlayers = 5;
for ( i = 0; i < numberOfPlayers; i++ ) {
    alert(i);
}

但是当我尝试以下代码时,我想每1秒运行一次函数,5,5,5,5,5

var numberOfPlayers = 5;
for ( i = 0; i < numberOfPlayers; i++ ) {
    setInterval(function () {
        alert(i);
    }, 1000);
}

任何人都可以向我解释这里发生了什么。我希望代码的两个部分都有相同的数字。

4 个答案:

答案 0 :(得分:2)

在第一个实例中,当它绕过循环时,你会提醒i的值。

在第二步中,您会在一秒钟后提醒i的值。到第二个过去时,循环已经完成了五次,因此当时i的值是i的最后一个值。

答案 1 :(得分:1)

我没有被绑定在循环内部的内部函数中 - 就像这样在循环的每次迭代中绑定它

var numberOfPlayers = 5;
for ( i = 0; i < numberOfPlayers; i++ ) {
   (function(i) { 
      setInterval(function () {
          alert(i);
      }, 1000);
   })(i);
}

答案 2 :(得分:0)

你应该得到5 5 5 5 5.原因是你的for循环很快运行并绑定该函数运行5次。它遍历自身,直到i等于5.当第二个启动并且函数计划运行时,i等于5.然后每1秒重复5次。

答案 3 :(得分:0)

正如@Quentin在他的回答中所解释的那样,这是一个时间问题,因为setInterval()内部的封闭。这里有一个很好的解释:Javascript infamous Loop issue?

对于这样的情况,我可能会使用@Soren建议的代码。另一种选择是使用单独的函数:

var numberOfPlayers = 5;
for ( i = 0; i < numberOfPlayers; i++ ) {
    intervalAlert(i);
}

function intervalAlert(i) {
    setInterval(function () {
        alert(i);
    }, 1000);
}

另见http://blog.mixu.net/2011/02/03/javascript-node-js-and-for-loops/