在本系列一開始時我們曾在瀏覽器生命週期討論過事件處理,現在來複習一下。
經過這麼多天,我們已經對 JavaScript 以及瀏覽器有進一步的了解,這個時候可以深入的來了解事件迴圈。
之前說只有一個 task queue 是簡化了的說法,其實 task queue 有二個,一個是處理大型任務的 macro task queue,另一個是處理微任務的 microtask queue。
為什麼要這樣分呢?在網頁應用程式中發生的事件有很多種,瀏覽器把來自使用者的事件視為較重要的,像是滑鼠事件、鍵盤事件等等,這些事件結束後需要更新頁面,給使用者回饋。另外一些較小型的任務,只是在更新應用程式的狀態,不會用到像大型任務那麼大的資源開銷,就會一併在更新UI前執行,像是處理 promise callback,還有回應 DOM 的修改。
因此瀏覽器在安排事件進入 task queue 時,會依照事件類型而分配到 macrotask queue 或 microtask queue 裡。
在目前執行的任務完成,但還沒有將 task queue 的任務提取出來之前,event loop 會先檢查有沒有任務在 microtask queue 之中,有的話會先提取它們,等到 microtask queue 的任務也清空了,才會提取 task queue 裡面的任務。