我是一個新手,並與以下代碼相混淆。閉包如何在下面的代碼中工作
for (var i=1; i<=5; i++) {
console.log('ooo');
setTimeout(function timer(){
console.log(i);
}, i*1000);
}
這段代碼的輸出是這樣的:
ooo
ooo
ooo
ooo
ooo
6
6
6
6
6
在此先感謝解釋我這個代碼。
我是一個新手,並與以下代碼相混淆。閉包如何在下面的代碼中工作
for (var i=1; i<=5; i++) {
console.log('ooo');
setTimeout(function timer(){
console.log(i);
}, i*1000);
}
這段代碼的輸出是這樣的:
ooo
ooo
ooo
ooo
ooo
6
6
6
6
6
在此先感謝解釋我這個代碼。
for (var i=1; i<=5; i++) {
console.log('ooo');
setTimeout(function timer(){
console.log(i);
}, i*1000);
}
在此代碼
當setTimeout的()被調用for循環會對成品和各功能會是指相同的值i的IE 6
function closure(i){
setTimeout(function timer(){
console.log(i);
}, i*1000);
}
for (var i=1; i<=5; i++) {
console.log('ooo');
closure(i);
}
這將打印i = 1至5,因爲這些函數只能看到i的對應值
setTimeout延遲了timer()函數的執行時間i * 1000毫秒。
我增加了你的for循環。當第一次執行定時器功能時,i已遞增並且現在被賦值爲6.
如果您想傳遞每次執行循環的i的實際值,則應該將其作爲參數爲您的定時器功能:
for (var i=1; i<=5; i++) {
console.log('ooo');
setTimeout(timer(i), i*1000);
}
function timer(local_i){
console.log(local_i);
}
正確的結果應該是像下面 你應該考慮如下指令 1級的代碼將控制檯000 < = 5次 我是你的一個循環遞增。由當時的計時器功能執行的第一次,我一直在增加,現在價值127然後6
16:57:40.946 ooo
16:57:40.946 ooo
16:57:40.946 ooo
16:57:40.947 ooo
16:57:40.947 ooo
16:57:40.947 127
16:57:41.949 6
16:57:42.947 6
16:57:43.951 6
16:57:44.947 6
16:57:45.950 6
如果for循環已經先於'setTimeout'函數調用結束,然後不應該只執行一次? – shahzaibkhalid
@shahzaibkhalid每次迭代完成後,settimeout函數將堆疊在一起。一旦瀏覽器的超時等待時間從堆棧中執行(此時i的值將爲6)。 – rish
setTimeout函數是一個異步函數,它將在作業隊列中等待,等待事件循環撿起它,當事件循環拾取它時,它會引用i = 6 – marvel308