For循环,Let和setTimeout

时间:2017-08-19 03:26:25

标签: javascript for-loop

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#中是否存在行为或者我是否有点生疏。

谢谢!

4 个答案:

答案 0 :(得分:1)

实际上非常简单。 for循环为所有五个值安排timer函数。然后计时器功能开始打印数字。现在它们被打印1秒的原因是i*1000 setTimeout。结果,1个将在安排后1秒打印,2个将在安排后2秒打印,大约 1秒后安排1,等等。

请参阅下面的代码段以了解其工作原理。请注意,setTimeout不会阻止for循环的执行。

&#13;
&#13;
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.");
&#13;
&#13;
&#13;

答案 1 :(得分:0)

setTimeout()会将您的timer()放入队列中。 for循环几乎立即执行得很快,每个循环计时器()将被放入队列中,延迟时间分别为1,2,3,4,5秒。

由于立即执行for循环,

console.log(i)将打印1-5。

答案 2 :(得分:0)

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

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

enter image description here

答案 3 :(得分:-1)

我希望这就是你要找的东西 System.Threading.Thread.Sleep(1000 * I);