javascript - 为什么 setTimeout 在循环内与递归函数内无法正确执行

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

最佳答案

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

“设置四个超时,从现在起一秒后结束”

您的第二个代码是:

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

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

关于javascript - 为什么 setTimeout 在循环内与递归函数内无法正确执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41538017/

相关文章:

javascript - Rails 3 if 语句与 jQuery ?

c - 这个 for 循环在 C 中做什么?

python - 如何访问 for 循环中的上一个/下一个元素?

JavaScript:如果未通过 CSS 明确定义,则获取元素的大小

javascript - 仅图像数据对象的一部分的 putImageData

javascript - jquery 使用其中的注释选择一个元素

javascript - 为什么这个对象循环不起作用?

c++使用加法递归地乘以2个整数

java - 在这个 if 条件下是否真的需要 >=。 == 还不够吗?

javascript - 异步执行递归数据树构建?