JS 的 Even Loop 是什麼?
解釋 JS 中的 Even Loop 機制
概述
簡單來說 JS 是單執行緒的機制,為了支援非同步的任務,而在JS引擎中引入的一個機制
機制內分為不同區塊 Stack、Queue、Heap
- JS 程式碼在執行時會依序將任務放入 Stack ,中並按照順序執行。
- 當一個任務呼叫為非同步任務時則會放在 Queue 內,待 Stack 內的任務完成後,會將 Queue 的任務放到 Stack 內最後按順序執行
Macrotask Queue、Microtask Queue
Callback Queue 又分為 Macrotask Queue 和 Microtask Queue
Macrotask Queue
- 從
<script src="...">
外部下載的 script - DOM event handlers,例如 mousemove event 的 callback function handler
- 各種 Web APIs,例如 setTimeout 的 callback function
- ajax callback function
Microtask Queue
- promise
.then/catch/finally
中的 callback function queueMicrotask(func)
中的 func
簡單來說,像是 Promise.then 在非同步任務中是屬於 Microtask Queue ,在 Even Loop 則會被分配到優先執行的 Microtask Queue
每個 Macrotask 執行結束後會先將 Microtask queue 中的任務全部執行完,才會繼續執行瀏覽器渲染跟其他 Macrotask。
舉例
這個執行印出答案為 1,3,4,2
Macrotask 為 console.log(1)
Microtask queue 為 Promise.then()
Macrotask Queue 為 setTimeout()
1 |
|
附上更詳細的解釋,有影片和圖片解釋寫的非常完整
JavaScript Event Loop解說:單執行緒還能異步運算?