这是一个共同的概念错误。
- JavaScript是无阻塞
- 给变量的引用传递,而不是实际值
你必须记住,该变量x
是动态的。对x
的引用传递给alert("For loop iteration #" + x);
而不是值。因此,当alert
最终执行时,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中,您调用继续执行代码的函数。
你的意思是(应该是6)。顺便说一句,这个问题每隔一天就会被问到,让我搜索... – kapa 2013-03-10 21:10:04
哦,对。我会编辑。 – americanknight 2013-03-10 21:11:05
例如:http://stackoverflow.com/questions/8567118/javascript-settimeout-issue-w-for-loop?rq=1 http://stackoverflow.com/questions/13774004/all-the-settimeouts-inside -javascript-for-loop-happen-at-once – kapa 2013-03-10 21:14:06