为什么setTimeout在递归函数内的循环VS内没有正确执行

时间:2017-01-08 21:20:19

标签: javascript for-loop recursion settimeout synchronous

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

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

2 个答案:

答案 0 :(得分:4)

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

“设置四个超时时间从现在开始一秒钟”

你的第二个代码是:

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

相当不同!关键是,设置多个超时不像一个队列,它们都将从你打电话时开始。

答案 1 :(得分:0)

您可能希望将延迟乘以i

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