JavaScript 事件循環(Event Loop)是 JavaScript 運行時環境(如瀏覽器和 Node.js)中處理異步操作的核心機制。它負責執行異步代碼、調度任務和處理事件。事件循環的工作原理可以分為以下幾個步驟:
執行同步代碼:首先,事件循環會執行當前調用棧(Call Stack)中的所有同步代碼。這些代碼會按照它們在代碼中出現的順序依次執行。
處理微任務(Microtasks):當調用棧為空時,事件循環會檢查微任務隊列(Microtask Queue)。微任務是一種特殊的異步任務,它們需要在當前任務完成后立即執行。常見的微任務包括 Promise 回調和 MutationObserver 回調。事件循環會依次執行微任務隊列中的所有任務,直到隊列為空。
執行宏任務(Macrotasks):當微任務隊列為空時,事件循環會從宏任務隊列(Macrotask Queue)中選擇一個任務執行。宏任務是一種相對較重的異步任務,例如 setTimeout、setInterval、I/O 操作和 UI 渲染等。事件循環會按照它們在隊列中出現的順序執行宏任務。每個宏任務執行完畢后,事件循環會再次檢查微任務隊列,執行其中的所有任務。
渲染:在執行完一個宏任務并處理完所有微任務后,瀏覽器會進行一次渲染操作,將頁面更新顯示給用戶。這一步不是每次事件循環都會發生,而是在特定條件下觸發,例如在執行完一個宏任務后,或者主動調用 requestAnimationFrame 時。
繼續下一輪事件循環:事件循環會不斷重復上述步驟,直到所有的任務都被執行完畢。
需要注意的是,不同瀏覽器和 JavaScript 引擎可能會有細微的事件循環實現差異。但總體來說,上述描述的事件循環工作原理在大多數情況下都是適用的。