forTime中setTimeOut中的异常行为

时间:2019-02-14 20:04:18

标签: javascript

我正在尝试按特定间隔将数字记录到控制台。但是,发生的事情是等待设置的时间间隔,然后照常注销所有内容。

我尝试了两种创建闭合的方法。但是对于延迟的console.log则不执行任何操作。

function timeOutLoop(x){
   for(var i = 0; i<=x; i++){
    (function(n){
      setTimeout(function(){console.log(n)},5000)
    })(i)

     setTimeout(function(num){
      return function(){
        console.log(num)
      }
    }(i),1000)
  }
}

timeOutLoop(33)

给我的印象是,每个setTimeout都将使用闭包提供的上下文进入事件队列。有什么作用?

3 个答案:

答案 0 :(得分:2)

由于循环基本上是立即执行的,因此与第一个循环没有太大区别,因为时间以毫秒为单位,而对于第二个循环,它们都将在1秒后执行。

结合使用这两种方法,可以实现:

 function timeOutLoop(x) {
  for(var i = 0; i <= x; i++) {
    setTimeout(function(num) {
      return function(){
          console.log(num);
      }
    }(i), i * 1000);
  }
}

timeOutLoop(33)

答案 1 :(得分:2)

setTimeouts是同时启动的,因此,如果您想一次又一次地启动超时,则可以创建一个递归函数:

function timeOutLoop(x, i=0){
   if(i<=x){
      console.log(i);
      i++;
      setTimeout(function(){timeOutLoop(x, i)},1000);
   }
}
timeOutLoop(33)

您可以将超时值设置为任意值。

答案 2 :(得分:1)

function timeOutLoop(x){
    for(let i = 0; i<=x; i++){
        setTimeout(function(){console.log(i)},i * 1000);    
    }
}
timeOutLoop(33);

这是您要找的东西吗?从var更改为let,以使变量i在循环范围内保持不变。 More here about let vs var

也将i乘以1000,每秒打印一次,直到达到33。