Javascript闭包设置超时间隔问题

Javascript闭包设置超时间隔问题,javascript,Javascript,为什么每1秒记录一次以下内容?我用1000毫秒乘以增量。我的日志不应该在1秒、2秒、3秒后显示吗 for (var i = 0; i < 5; i++) { (function(r) { setTimeout( function() { console.log(r) } , r * 1000 ); })(i) } for(变量i=0;i

为什么每1秒记录一次以下内容?我用1000毫秒乘以增量。我的日志不应该在1秒、2秒、3秒后显示吗

for (var i = 0; i < 5; i++) {
  (function(r) {
    setTimeout(
      function() { 
        console.log(r)
      } 
    , r * 1000 );
  })(i)
}
for(变量i=0;i<5;i++){
(功能(r){
设置超时(
函数(){
console.log(r)
} 
,r*1000);
})(一)
}

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

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

我的日志不应该在1秒、2秒、3秒后显示吗

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

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

,这是因为调用
setTimeout
不会停止代码的执行。循环将继续,并从一开始在每个循环中执行所有
setTimeout()
。这就是为什么它每秒钟都会记录。它们会在1、2、3和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);
看起来是这样的

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

希望有帮助

你的兄弟其实没什么问题。发生的情况是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)
        }
for(变量i=0;i<5;i++){
log(执行的新日期()+“循环:”+(i+1));
(功能(r){
设置超时(
函数(){
console.log(新日期()+“”+r)
}
(r*1000));
})(一)
}