聽過Event Loop嗎

Event Loop是JavaScript中協調執行緒的一個機制。它保證每次僅執行一個任務,並且在執行任務之間允許訊息佇列中的其他訊息進行排程。事件迴圈是JavaScript的核心概念,它保證了程式碼是非阻塞的,並且在後臺執行任務,而不影響頁面的響應性。
Promise.resolve().then(()=>{ console.log('Promise1') setTimeout(()=>{
console.log('setTimeout2') },0)
})
setTimeout(()=>{
console.log('setTimeout1') Promise.resolve().then(()=>{ console.log('Promise2') })
},0)
-
一開始執行棧空,我們可以把執行棧認為是一個儲存函式呼叫的棧結構,遵循先進後出的原則。微任務佇列空,宏任務佇列裡有且只有一個 script 指令碼(整體程式碼)。
-
全域性上下文(script 標籤)被推入執行棧,同步程式碼執行。在執行的過程中,會先判斷是同步任務還是非同步任務,也會產生新的 macro-task 與 micro-task,它們會分別被推入各自的任務佇列裡。同步程式碼執行完了,script 指令碼會被移出 macro 佇列,這個過程本質上是佇列的 macro-task 的執行和出隊的過程。
-
上一步我們出隊的是一個 macro-task,這一步我們處理的是 micro-task。但需要注意的是:當 macro-task 出隊時,任務是一個一個執行的;而 micro-task 出隊時,任務是一隊一隊執行的。因此,我們處理 micro 佇列這一步,會逐個執行佇列中的任務並把它出隊,直到佇列被清空。宏任務佇列可以有多個,微任務佇列只有一個。
-
執行渲染操作,更新介面
-
檢查是否存在 Web worker 任務,如果有,則對其進行處理
-
上述過程迴圈往復,直到兩個佇列都清空
最棒的解釋
What the heck is the event loop anyway? | Philip Roberts | JSConf EUJavaScript programmers like to use words like, "event-loop", "non-blocking", "callback", "asynchronous", "single-threaded" and "concurrency". https://www.youtube.com/watch?v=8aGhZQkoFbQ
https://www.youtube.com/watch?v=8aGhZQkoFbQ
event loop ⇒: 如果stack 是空的 他就會把task queue的第一個值放上去~stack
