2017-09-01 37 views
0

我是一個新手,並與以下代碼相混淆。閉包如何在下面的代碼中工作

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 

在此先感謝解釋我這個代碼。

回答

0
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的對應值

+0

如果for循環已經先於'setTimeout'函數調用結束,然後不應該只執行一次? – shahzaibkhalid

+0

@shahzaibkhalid每次迭代完成後,settimeout函數將堆疊在一起。一旦瀏覽器的超時等待時間從堆棧中執行(此時i的值將爲6)。 – rish

+0

setTimeout函數是一個異步函數,它將在作業隊列中等待,等待事件循環撿起它,當事件循環拾取它時,它會引用i = 6 – marvel308

0

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

正確的結果應該是像下面 你應該考慮如下指令 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 
相關問題