【问题标题】:Why does setTimeout not execute properly inside a loop VS inside a recursive function为什么 setTimeout 不能在循环内正确执行 VS 在递归函数内
【发布时间】:2017-05-23 02:58:15
【问题描述】:

此代码等待一秒钟并立即执行所有迭代:

for(let i=0;i<4;i++){
    setTimeout(function(){console.log("Hello")},1000)
}

此代码按预期正确执行:

var i = 0;
function loop(){
setTimeout(function(){
    console.log("Hello" + " " + Number(i+1))
    i++
    if(i<3){
        loop()
    }
},1000)

loop()

我的问题是为什么?这是否与 JavaScript 的同步单线程特性有关?为何如此?关于为什么会发生这种情况的解释是我的问题。

【问题讨论】:

    标签: javascript for-loop recursion settimeout synchronous


    【解决方案1】:

    您的第一个代码是这样做的:

    “设置四个超时以在一秒后关闭”

    您的第二个代码是:

    “设置超时并提醒i 的值,递增i,如果循环未结束则设置新的超时”

    差别很大!关键是,设置多个超时并不像一个队列,它们都是从你调用它们开始的。

    【讨论】:

    • 我可以使用循环实现第二个代码的结果吗?
    • 你可以改用setInterval,并在4次迭代后停止
    【解决方案2】:

    您可能希望将延迟乘以 i

    var f = function(){console.log("Hello")};
    for (let i=0; i<4; ++i) setTimeout(f, i * 1000);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-04
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2015-07-14
      • 1970-01-01
      相关资源
      最近更新 更多