理解問題:嵌套在for 循環中的setTimeout 中的非連續值列印
在JavaScript 中,像setTimeout 這樣的非同步函數會安排回調延遲後執行。當放置在循環中時,這可能會導致意外行為,其中回調存取的變數可能與循環的狀態不同步。
範例:警告不正確的值
考慮提供的腳本:
for (var i = 1; i <= 2; i++) { setTimeout(function() { alert(i) }, 100); }
此程式碼旨在連續警告值1 和2,而是輸出3 兩次。原因在於 setTimeout 的非同步特性,它建立了一個引用 i 目前值的回呼。
在沒有函數字串的情況下傳遞i
來解決這個問題為了確保連續的值打印,我們需要為每個setTimeout 回調創建一個不同的i 實例。這是一個解決方案:
function doSetTimeout(i) { setTimeout(function() { alert(i); }, 100); } for (var i = 1; i <= 2; ++i) doSetTimeout(i);
透過為每個回調建立一個明確函數並將 i 作為參數傳遞,我們為循環的每次迭代建立 i 的單獨副本。這允許回調在執行時引用 i 的正確值,確保 1 和 2 的連續列印。
以上是為什麼 JavaScript `for` 循環中嵌套的 `setTimeout` 會列印不連續的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!