iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 28
0

在本系列一開始時我們曾在瀏覽器生命週期討論過事件處理,現在來複習一下。

  • 瀏覽器的執行環境是單一執行緒模型(single-threaded execution model),也就是說 JavaScript 引擎一次只能處理一段程式碼。
  • 但是網頁應用程式互動是多線並行的,不可能要求使用者停止一切動件等待目前的程式處理完。JavaScript 實現多執行緒的方式是建立一個任務佇列(task queue)。
  • 瀏覽器依事件發生的順序,將事件函式放到 task queue 裡。
  • 瀏覽器有個機制叫事件迴圈(event loop),它會一直監控 task queue,只要目前沒有程式碼在執行,就會把排在 task queue 第一個的函式提取出來執行,一直到 task queue 清空。

經過這麼多天,我們已經對 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 裡面的任務。


上一篇
Day 27: JavaScript 模組化
下一篇
Day 29: 計時器
系列文
JavaScript 忍者的修練--從下忍進階到中忍30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言