这是一个常见的概念错误。
- Javascript 是非阻塞的
- 传递了对变量的引用,而不是实际值
您必须记住,变量x
是动态的。引用x
传递给alert("For loop iteration #" + x);
非值。因此,当alert
finally 被执行x
时将具有它在执行点而不是在setTimeout
启动点的值!
本质上它是这样的:
处理你的循环,创建 6 个超时,然后立即显示你的alert("Code to be executed after completed for loop");
. 然后在一段时间后,您的超时将被执行,然后在循环完成后将所有显示变量 x 的状态 - 6
。
您需要一个闭包,以便将值x
传递给警报,而不是对变量x
本身的引用。
for (var x = 0; x <= 5; x++) {
(function(z) {
setTimeout(function() {
alert("For loop iteration #" + z);
}, 5 * z);
})(x);
}
编辑:
要解决第二个问题,您需要使用回调函数。CB 函数是您的代码的逻辑延续,但不应立即执行,而是需要暂停到某个点(您的最后一个警报已发生)。你会像这样实现它:
for (var x = 0; x <= 5; x++) {
(function(z) {
setTimeout(function() {
alert("For loop iteration #" + z);
if (z===5){ continue_code() }
}, 5 * z);
})(x);
}
function continue_code(){
alert("Code to be executed after completed for loop");
// Here comes all your code
// which has to wait for the timeouts from your for loop
}
在最后一个 setTimeout 中,您调用继续执行代码的函数。