我不明白關閉的事實是setTimeout
回調不會觸發,直到循環結束。它看起來很明顯,在每次迭代期間都會執行該功能。當定時器爲0ms時,爲什麼setTimeout回調會等待循環結束?
我不擔心他們爲什麼都是「6」我理解那部分。我只需要解釋爲什麼它在實際運行之前等待循環完成。
for (var i = 1; i <= 5; i++)
{
setTimeout(function timer()
{
console.log(i);
}, 0);
}
我不明白關閉的事實是setTimeout
回調不會觸發,直到循環結束。它看起來很明顯,在每次迭代期間都會執行該功能。當定時器爲0ms時,爲什麼setTimeout回調會等待循環結束?
我不擔心他們爲什麼都是「6」我理解那部分。我只需要解釋爲什麼它在實際運行之前等待循環完成。
for (var i = 1; i <= 5; i++)
{
setTimeout(function timer()
{
console.log(i);
}, 0);
}
JavaScript運行一個event loop。
事件循環忙於運行正在調用setTimeout
的函數,因此它不會查看是否有任何事件在等待運行的超時隊列中。
即使情況並非如此,大多數JS實現都會實現一個最小超時值(請參閱Minimum delay and timeout nesting),如果它低於該值,則向其傳遞任何值(0
)。
setTimeouts排隊,開始在當前事件循環結束時運行。所以,setTimeouts可以晚於for循環結束。
MDN有關於該事件的循環有很大的描述方面的setTimeout:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/EventLoop
特別是這部分:
調用setTimeout的會經過的時間 後添加一個消息隊列第二個論點。如果隊列中沒有其他消息,則 消息立即處理;但是,如果有消息,則 setTimeout消息將不得不等待其他消息處理爲 。出於這個原因,第二個參數表示最少 時間,而不是保證時間。
最常見的javascript複製。 – djechlin
這是因爲JavaScript是單線程的,所以在任何異步代碼('setTimeout'回調)'可以執行之前,代碼的當前同步執行(循環)必須完成。 –
...此外,將'0'傳遞給'setTimeout'永遠不會意味着'0'毫秒。通常有一個最低建立。 –