[英]Why is my JavaScript loop with time delay (using setTimeout) not modifying variables?
我想用 JavaScript 編寫一個循環,每次迭代后都有一個延遲。 我嘗試增加數組中的元素。 但它根本沒有修改數組中的元素!
let A = [1, 2, 3, 4];
let N = A.length;
let f = i => {
setTimeout(
() => {
A[i] += 1;
if (++i < N) {
f(i);
}
},
100
);
}
f(0);
console.log(A);
預期的輸出是[2, 3, 4, 5]
,但我得到[1, 2, 3, 4]
。 如果我在增量后添加console.log(A[i])
let A = [1, 2, 3, 4];
let N = A.length;
let f = i => {
setTimeout(
() => {
A[i] += 1;
console.log(A[i]);
if (++i < N) {
f(i);
}
},
100
);
}
f(0);
console.log(A);
它打印出預期值2 3 4 5
。 但是console.log(A)
仍然打印原始數組[1, 2, 3, 4]
。 OTOH,如果我使用 for 循環,它會起作用。
let A = [1, 2, 3, 4];
let N = A.length;
for (let i = 0; i < N; i++) {
A[i] += 1;
}
console.log(A);
我錯過了一些明顯的東西嗎?
為什么我的 JavaScript 循環延遲(使用 setTimeout)不修改變量?
它正在修改變量。 但是你在修改之前觀察變量。 您的代碼的操作順序是有效的:
(作為關於調試的說明,您對此行為的最大線索應該是在記錄每個“正確”值之前記錄整個“不正確”數組。)
所以代碼按預期工作,您只需要在代碼執行其任務后觀察結果。
當前數組有 4 個元素,因此修改總共需要 400 毫秒。 將其設置為在 500 毫秒后登錄到控制台並觀察更新后的數組:
setTimeout(() => console.log(A), 500);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.