为什么 setTimeout 在循环内 VS 在递归函数内不能正确执行

Why does setTimeout not execute properly inside a loop VS inside a recursive function

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

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 的同步单线程性质有关吗?为何如此?关于为什么会发生这种情况的解释是我的问题。

您的第一个代码执行此操作:

"Set four timeouts to go off in one second from now"

您的第二个密码是:

"Set a timeout and alert the value of i, increment i and if the loop isn't over then set a new timeout"

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

您可能希望将延迟乘以 i

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