2 回答

TA貢獻(xiàn)1784條經(jīng)驗 獲得超7個贊
您得到 9 是因為您要添加result到循環(huán)計數(shù)器i中,并且每次循環(huán)迭代時這兩個數(shù)字都會增加。如果您只希望最終答案為 3,那么您根本不需要result并且可以在循環(huán)的最終迭代時報告循環(huán)計數(shù)器的值。
目前尚不清楚您的目標(biāo)是什么,但是當(dāng)人們想要重復(fù)完成某件事時,通常會認(rèn)為計時器屬于循環(huán)。計時器可以做到這一點,而無需任何循環(huán)通過setInterval()計時器或遞歸setTimeout()計時器來幫助它。兩種方法如下所示:
遞歸 setTimeout() 定時器:
var result = 0;
function timerCallback(){
if(result < 3){
console.log(++result);
// A second timer is embedded in the
// first timer's callback function.
// This second timer calls the current
// function, setting up a looping flow.
setTimeout(timerCallback, 1000);
}
}
// Start a one time timer
setTimeout(timerCallback, 1000);
setInterval() 定時器:
var timer = null; // Will hold reference to timer's id
var result = 0;
function timerCallback(){
if(result < 3){
console.log(++result);
} else {
// Cancel timer
clearInterval(timer);
}
}
// Start a timer that continues
// until it is stopped.
timer = setInterval(timerCallback, 1000);

TA貢獻(xiàn)1793條經(jīng)驗 獲得超6個贊
當(dāng)你寫
var result = 0;
for (var i=0; i < 3; i++) {
setTimeout(function() {
result += i;
}, 1000);
}
因為 javascript 變量提升它變成了
var result = 0;
var i;
for (i=0; i < 3; i++) {
setTimeout(function() {
result += i;
}, 1000);
}
var i移動到頂部。
setTimeout并且由于javascript是非阻塞的,因此在調(diào)用堆棧中沒有更多阻塞操作(即循環(huán)結(jié)束后)之后,您的情況下的所有異步代碼都將執(zhí)行。
當(dāng)循環(huán)結(jié)束i is 3時result += 3,執(zhí)行 3 次,結(jié)果變?yōu)?9
但是,如果您希望它是我可以從下面的問題中看到的
result += 0;
result += 1;
result += 2;
結(jié)果 3
那么你可以通過closure
var result = 0;
for (var i=0; i < 3; i++) {
const j = i;
setTimeout(function() {
result += j;
console.log(result);
}, 1000);
}
在這種情況下,最終結(jié)果將是 3
這里發(fā)生的是,j聲明將在每次循環(huán)迭代中對 i 的值進(jìn)行閉包,并且每次迭代的 setTimeout 將記住它們在迭代時附加的 j 的值。
希望這可以幫助
添加回答
舉報