JavaScript 事件循環是一種處理異步操作的執行模型,它允許在單線程環境中執行非阻塞代碼。事件循環通過不斷地檢查任務隊列來調度和執行任務。以下是事件循環實現任務調度的關鍵步驟:
初始化:創建一個名為 taskQueue
的空數組,用于存儲待執行的任務。
微任務隊列:創建一個名為 microTaskQueue
的空數組,用于存儲微任務。微任務包括 Promise 回調、MutationObserver 回調等。
宏任務隊列:創建一個名為 macroTaskQueue
的空數組,用于存儲宏任務。宏任務包括 script(整體代碼)、setTimeout、setInterval、setImmediate(Node.js 環境)等。
執行循環:事件循環會不斷地執行以下步驟,直到 taskQueue
為空:
a. 將 microTaskQueue
中的所有微任務添加到 taskQueue
的末尾。
b. 從 taskQueue
中取出一個任務并執行。執行完一個宏任務后,檢查 microTaskQueue
是否為空,如果不為空,則將 microTaskQueue
中的所有微任務添加到 taskQueue
的末尾,然后繼續執行下一個宏任務。
c. 將一個宏任務添加到 macroTaskQueue
的末尾。
當 taskQueue
為空時,事件循環結束。此時,可以認為任務調度已經完成。
需要注意的是,微任務和宏任務的執行順序是不同的。微任務的執行優先級高于宏任務,即微任務隊列中的任務會在當前宏任務執行完畢后立即執行。這樣可以確保 JavaScript 能夠在單線程環境中高效地處理異步操作。