第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有人可以幫助解釋 for 循環(huán)中的 setTimeout 是如何工作的嗎?這和閉包有關(guān)系嗎

有人可以幫助解釋 for 循環(huán)中的 setTimeout 是如何工作的嗎?這和閉包有關(guān)系嗎

回首憶惘然 2022-10-27 15:15:32
var result = 0;for (var i=0; i < 3; i++) {  setTimeout(function() {    result += i;  }, 1000);}為什么結(jié)果會等于 9 而不是 3?
查看完整描述

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);


查看完整回答
反對 回復(fù) 2022-10-27
?
搖曳的薔薇

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 的值。


希望這可以幫助


查看完整回答
反對 回復(fù) 2022-10-27
  • 2 回答
  • 0 關(guān)注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號