Quick overview of the JavaScript event loop
•3 min read
javascript 處理非同步任務的機制,其組成包含:
- heap
- call stack
- web api
- event loop
- microtask queue
- macrotask queue
Heap
用來存放複雜類型資料的空間,例如:物件或陣列引用類型的值
在 function 內部建立物件、陣列等引用類型的資料,也會放至 heap 中,其對應的 reference 會存在 execution context 內,這些 reference 會在 function 執行結束後,被 gc 處理,藉此釋放不需要的記憶體空間
Call stack
用於追蹤執行中的 function 及 execution context
Web API
瀏覽器提供處理非同步任務的接口,當非同步任務完成時,其 callback function 會被放入對應的 queue 等待執行
queue 分為兩種類型:
- macrotask queue
- microtask queue
Macrotask queue
macrotask 包含:
setTimeout
,setInterval
requestAnimationFrame
- user interaction event callback
- etc.
Microtask queue
優先級高於 macrotask 的任務,每個 macrotask 執行完畢後,會立即處理 microtask queue 內的所有任務,直到 microtask queue 為空
microtask 包含:
MutationObserver
process.nextTick
queueMicrotasks
Promise.then
,Promise.catch
,Promise.finally
- etc.
Event Loop
簡易的運作流程如下:
- 當 javascript engine 開始執行 scripts
- 同步的操作,放入 call stack 執行
- 非同步的操作,透過 web api 在背景處理。非同步任務完成後,會將 callback 放置在對應的 queue 上等待執行
- 當 call stack 為空
- 取出第一個 microtask,放入 call stack 執行,重複此步驟,直到 microstak queue 為空
- 取出第一個 macrotask,放入 call stack 執行,執行完成後,檢查 microtask queue 是否有新的 microtask
- 如果有,重複 2.1 的步驟,直到 microtask queue 為空
- 如果沒有,重複 2.2 的步驟,執行下一個 macrotask
- 重複上述步驟