//1 setTimeout(() => { console.log('hi'); }, 5000) //2 setTimeout(() => { console.log('hello'); }, 3000) //3 setTimeout(() => { console.log('bye'); }, 0) //4 setTimeout(() => { console.time('the code took:'); let i = 10000 while (i--) { console.log(i); } console.timeEnd('the code took:') }, 7000)
這裡我寫了四個setTimeout函數,根據我的了解,它們會在回呼佇列中同時開始執行,對嗎?如果我是對的,那麼我的疑問是,第四個setTimeout()函數在回調佇列中是否已經完成了一半或超過一半的執行,還是在推入呼叫堆疊後的7秒鐘後,它從頭開始執行?所以後台發生了什麼事?
這些函數在回呼佇列中不會並行或同時運行。它們是單獨和非同步地調度的。執行順序取決於每個函數的指定延遲。對於每個setTimeout函數,都會安排一個回呼在指定的延遲之後執行。
執行順序如下:
#然而,第四個setTimeout函數不一定與其他setTimeout函數一起執行,也無法保證其自身的執行時間。 執行順序由回調佇列決定,事件循環從回調佇列中取得任務,並且僅當呼叫堆疊為空時才在呼叫堆疊中執行它們。因此,只有在呼叫堆疊中沒有其他任務時,第四個setTimeout函數才會開始執行。運行給定程式碼後,輸出應按照以下順序顯示:
以下是輸出的序列: