2017-02-15 96 views
0

請運行該代碼片段,就像你看到的,控制檯輸出如下:當我在for循環中調用setTimeout時發生了什麼?

1 
... 
5 
6 (5 times) 

所以,據我所知,setTimeout創建一個新的函數棧,但i<=5應時i == 5停下來,這樣我就可以」不明白爲什麼6

This is MDN about explain setTimeout.

從1到5我是很容易理解,但是發生了什麼事時,電話setTimeout,以及如何解釋6控制檯存在嗎?

for(var i = 1; i <= 5; i++) { 
 
    console.log(i) 
 
    setTimeout(function() { 
 
     console.log(i) 
 
    }, 0) 
 
}

+0

循環首先被執行,然後是延遲函數,那時'i'的值是6.另外,'timer'和'clearInterval'對於代碼中的'setTimeout' – Teemu

+0

@Teemu我刪除了我的另一個演示版本留下的一些無意義的代碼。 –

回答

0

第一console.log呼叫被連續運行五次的setTimeout的那些曾經在開始之前。然後,i是6,並且console.log(i)被稱爲那些全部排隊的五次。

當您運行setTimeout時,它會返回定時器的句柄。你實際上沒有對返回值做任何事情,但它仍然在隊列中。

另外,超時值0在技術上並不意味着「立即運行」,它只是意味着「添加到隊列的頂部」。

0

for(let i = 1; i <= 5; i++) { 
 
    setTimeout(function() { 
 
     console.log(i) 
 
    }, 0) 
 
}

變種創建未作用域for循環的塊(它不是塊作用域),而讓這是否一個變量。因此,使用setTimeout調用創建的函數將全部查看相同的var,因此可以打印6(它的值在他們有機會運行的時間,而let,它們在這個塊範圍變量上有一個閉包,因此所有正確地打印它們的預期值,1..5。

相關問題