【问题标题】:For loop, Let, and setTimeoutFor 循环、Let 和 setTimeout
【发布时间】:2017-08-19 03:26:25
【问题描述】:
for (let i=1; i<=5; i++) {
    setTimeout( function timer(){
        console.log( i );
    }, i*1000 );
}

我在这里感到困惑的最重要的事情 - 为什么会打印 1,2,3,4,5 - 相隔一秒?而不是增加一秒,每次通过 for 循环时多花一秒?我还有另一个让我感到困惑的变体,我将 console.log(i) 作为 for 循环的最后一步,它只是立即发布 1-5。这里有什么帮助吗?

来自 C#,为了记录,不确定 C# 中是否存在这种行为,或者我只是有点生疏。

谢谢!

【问题讨论】:

  • 因为每个 setTimeout 几乎并行运行,因为 setTimeout 是异步的
  • setTimeout 没有阻塞,它只是表明它将在i*1000 秒内运行该函数(异步)。基本上,如果您说某事将在 1 秒内运行,某事将在 2 秒内运行,那么两者之间只有 1 秒的差异。

标签: javascript for-loop


【解决方案1】:

其实很简单。 for 循环为所有五个值调度 timer 函数。然后计时器功能开始打印数字。现在,它们间隔 1 秒打印的原因是 i*1000 in setTimeout。结果,1 将在调度后 1 秒打印,2 将在调度后 2 秒打印,大约在 1 调度后 1 秒,以此类推。 .

请参阅下面的 sn-p 以了解其工作原理。请记住,setTimeout 不会阻止 for 循环的执行。

for (let i=1; i<=5; i++) {
    setTimeout( function timer(){
        console.log( i );
    }, i*1000 );
    
    console.log("Print " + i + " after " + i +" seconds.");
}

console.log("for loop completed.");

【讨论】:

    【解决方案2】:

    setTimeout() 会将您的timer() 放入队列中。 for 循环执行非常快,几乎立即执行,每个循环 timer() 将被放入队列中,延迟分别为:1、2、3、4、5 秒。

    console.log(i) 将打印 1-5,因为 for 循环会立即执行。

    【讨论】:

    • 我已经尝试过代码://输出 1 //1 秒 2 //2 秒 3 //3 秒...你是什么意思?
    【解决方案3】:

    我猜其他答案没有涉及到的是事件循环

    事件循环是一个不同于主 JS 线程的执行线程。 您的 for 循环将在主 JS 线程中执行,将每个超时推送到事件循环中,该事件循环将按计划在事件循环中执行。事件的时间尺度看起来像这样。

    【讨论】:

    • 我认为你需要设置一个断点并观察'i'每次迭代的值。您会发现它会增加,因此超时设置会连续增加 1 秒。
    【解决方案4】:

    我希望这是您正在寻找的 System.Threading.Thread.Sleep(1000*i);

    【讨论】:

      猜你喜欢
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      相关资源
      最近更新 更多