這是一個共同的概念錯誤。
- 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