为什么 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);
此代码等待一秒钟并立即执行所有迭代:
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);