Javascript闭包setTimeout间隔问题

时间:2015-08-14 02:01:53

标签: javascript

为什么以下每1秒记录一次?我将1000毫秒乘以增量。我的日志不应该在1秒后显示,然后是2秒,然后是3秒?

for (var i = 0; i < 5; i++) {
  (function(r) {
    setTimeout(
      function() { 
        console.log(r)
      } 
    , r * 1000 );
  })(i)
}

JSFIDDLE

4 个答案:

答案 0 :(得分:4)

它正常工作,基本上,循环用作写这个的简写:

setTimeout( function(){ console.log(0) }, 1000)
setTimeout( function(){ console.log(1) }, 2000)
setTimeout( function(){ console.log(2) }, 3000)
setTimeout( function(){ console.log(3) }, 4000)
setTimeout( function(){ console.log(4) }, 5000)

因此,每个人都会一个接一个地看起来像这样:

▀
▀▀
▀▀▀
▀▀▀▀
▀▀▀▀▀

您可能正在寻找的是

(function newTimeout( seconds ){
  if( seconds > 4 ) return;
  console.log(seconds);
  setTimeout( function(){
    newTimeout( seconds + 1 )
  }, seconds * 1000);
})(0);

有点像这样

▀
 ▀▀
   ▀▀▀
      ▀▀▀▀
          ▀▀▀▀▀
希望它有所帮助!

答案 1 :(得分:3)

你的循环兄弟实际上没有任何问题。会发生什么是同时执行setTimeout执行。请记住,您的小循环执行时间只需几毫秒。

概念验证。

        for (var i = 0; i < 5; i++) {
            console.log(new Date() + " Loop Executed: " + (i + 1));
            (function (r) {
                setTimeout(
                  function () {
                      console.log(new Date() + " " + r)
                  }
                , (r * 1000));
            })(i)
        }

答案 2 :(得分:2)

  

为什么每1秒记录一次以下内容?

因为第一个记录在0 x 1000ms之后,第二个记录在1 x 1000ms之后,第三个记录在2 x 1000ms之后...所以,在0,1,2,3,4秒之后

  

我的日志不应该在1秒后显示,然后是2秒,然后是3秒?

实际上在0,1,2,3和4秒之后 - 但它不是累积的,你几乎在同一时间开始所有的超时

答案 3 :(得分:2)

那是因为调用setTimeout不会停止执行代码。循环将继续并从头开始执行每个循环中的所有setTimeout()。这就是它每秒记录的原因。它们会在1,2,3和4秒后熄灭,但同时启动。