TA

TA

事件循環

前言#

事件循環(Event Loop)是指瀏覽器或 Node 的一種解決 JavaScript 單線程運行時不會阻塞的機制,也就是我們經常使用異步的原理。

事件循環#

在 JavaScript 中,任務被分為兩種,一種是宏任務(MacroTask)也叫 Task,一種叫微任務(MicroTask)。

宏任務(MacroTask)#

script 全部代碼、setTimeout、setInterval、setImmediate(瀏覽器暫時不支持,只有 IE10 支持,具體可見 MDN)、I/O、UI Rendering。

微任務(MicroTask)#

Process.nextTick(Node 獨有)、Promise、Object.observe(廢棄)、MutationObserver(具體使用方式查看這裡)

瀏覽器中的事件循環#

JavaScript 有一個 main thread 主線程和 call-stack 調用棧(執行棧),所有的任務都會被放到調用棧等待主線程執行。

JS 調用棧#

JS 調用棧採用的是後進先出的規則,當函數執行的時候,會被添加到棧的頂部,當執行棧執行完成後,就會從棧頂移出,直到棧內被清空。

同步任務和異步任務#

JavaScript 單線程任務被分為同步任務和異步任務,同步任務會在調用棧中按照順序等待主線程依次執行,異步任務會在異步任務有了結果後,將註冊的回調函數放入任務隊列中等待主線程空閒的時候(調用棧被清空),被讀取到棧內等待主線程的執行。
任務隊列(Task Queue),即隊列,是一種先進先出的一種數據結構。

事件循環的進程模型#

選擇當前要執行的任務隊列,選擇任務隊列中最先進入的任務,如果任務隊列為空即 null,則執行跳轉到微任務(MicroTask)的執行步驟。
將事件循環中的任務設置為已選擇任務。
執行任務。
將事件循環中當前運行任務設置為 null。
將已經運行完成的任務從任務隊列中刪除。
microtasks 步驟:進入 microtask 檢查點。
更新界面渲染。
返回第一步。

執行進入 microtask 檢查點時,用戶代理會執行以下步驟:#

設置 microtask 檢查點標誌為 true。
當事件循環 microtask 執行不為空時:選擇一個最先進入的 microtask 隊列的 microtask,將事件循環的 microtask 設置為已選擇的 microtask,運行 microtask,將已經執行完成的 microtask 設置為 null,移出 microtask 中的 microtask。
清理 IndexDB 事務
設置進入 microtask 檢查點的標誌為 false。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。