【问题标题】:Strange logic with setInterval()setInterval() 的奇怪逻辑
【发布时间】:2014-08-25 22:21:34
【问题描述】:

我刚开始学习 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);
}

谁能向我解释这里实际发生了什么。我希望两部分代码中的数字相同。

【问题讨论】:

标签: javascript


【解决方案1】:

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

在一秒钟后,您会提醒i 的值。到那一秒过去了,循环已经完成了大约五次,所以当时i 的值是i 的最后一个值。

【讨论】:

    【解决方案2】:

    I 没有绑定在循环内的内部函数中——在循环的每次迭代中绑定到类似这样的东西

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

    【讨论】:

      【解决方案3】:

      您应该得到 5 5 5 5 5。原因是您的 for 循环运行得非常快,并将函数绑定到运行 5 次。它会遍历自身,直到 i 等于 5。当秒数结束并且函数计划运行时,i 等于 5。然后它将每 1 秒重复 5 次。

      【讨论】:

        【解决方案4】:

        正如@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/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-04-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-26
          • 2018-11-23
          • 1970-01-01
          相关资源
          最近更新 更多