2014-05-19 80 views
-1

我不明白關閉的事實是setTimeout回調不會觸發,直到循環結束。它看起來很明顯,在每次迭代期間都會執行該功能。當定時器爲0ms時,爲什麼setTimeout回調會等待循環結束?

我不擔心他們爲什麼都是「6」我理解那部分。我只需要解釋爲什麼它在實際運行之前等待循環完成。

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

最常見的javascript複製。 – djechlin

+0

這是因爲JavaScript是單線程的,所以在任何異步代碼('setTimeout'回調)'可以執行之前,代碼的當前同步執行(循環)必須完成。 –

+1

...此外,將'0'傳遞給'setTimeout'永遠不會意味着'0'毫秒。通常有一個最低建立。 –

回答

0

JavaScript運行一個event loop

事件循環忙於運行正在調用setTimeout的函數,因此它不會查看是否有任何事件在等待運行的超時隊列中。

即使情況並非如此,大多數JS實現都會實現一個最小超時值(請參閱Minimum delay and timeout nesting),如果它低於該值,則向其傳遞任何值(0)。

3

setTimeouts排隊,開始在當前事件循環結束時運行。所以,setTimeouts可以晚於for循環結束。

MDN有關於該事件的循環有很大的描述方面的setTimeout:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/EventLoop 

特別是這部分:

調用setTimeout的會經過的時間 後添加一個消息隊列第二個論點。如果隊列中沒有其他消息,則 消息立即處理;但是,如果有消息,則 setTimeout消息將不得不等待其他消息處理爲 。出於這個原因,第二個參數表示最少 時間,而不是保證時間。

相關問題