事件循環——JavaScript
Dec 04, 2024 am 04:13 AM事件循環是維護 JavaScript 程式碼執行順序(處理非同步操作而不阻塞主執行緒)的循環。
在深入事件循環之前需要了解的事情:
- 呼叫堆疊:這是 JavaScript 執行程式碼的地方。它遵循後進先出 (LIFO) 結構。當呼叫函數時,會建立一個新的執行上下文並將其推入堆疊。當功能結束時,它會彈出。
- MicroTasks 隊列:專用於queueMicroTask 方法、Promise 處理程序、特殊隊列回呼和MutationObserver(介面提供了監視 DOM 樹所做變更的能力)。 MacroTasks 隊列:來自Web API 的所有其他回調(
- setTimeout、setInterval、DOM API , fetch)進入巨集任務佇列。 什麼是事件循環?
這是一個無限循環,等待任務並將其推送到呼叫堆疊中執行。由於 JavaScript 是單執行緒的,它會維護一個執行順序來根據優先權處理同步非同步操作。
- 常規 JS 程式碼:
- 同步程式碼首先運行並填入呼叫堆疊。 MicroTasks:
- 在 microTasks 佇列中排隊的任務被執行。 MacroTasks:
- 在 MacroTasks 佇列中排隊的任務被執行。
// Programmatic way of how the event loop processes tasks while (true) { // Step 1: Execute tasks in the call stack while (!callStack.isEmpty()) { const currentTask = callStack.pop(); currentTask(); // Executes the task } // Step 2: Process all microtasks while (!microTasksQueue.isEmpty()) { const microTask = microTasksQueue.shift(); callStack.push(microTask); // Push microtask to call stack for execution } // Step 3: Process one macrotask if available if (!macroTasksQueue.isEmpty()) { const macroTask = macroTasksQueue.shift(); callStack.push(macroTask); // Push macrotask to call stack for execution } // Break if there's nothing left to process if (callStack.isEmpty() && microTasksQueue.isEmpty() && macroTasksQueue.isEmpty()) { break; } }
1. setTimeout(() => console.log(1), 2000); 2. Promise.resolve().then(() => { 3. console.log(2); 4. queueMicroTask(() => console.log(3)); 5. }); 6. Promise.resolve().then(() => { 7. console.log(4); 8. setTimeout(() => console.log(5)); 9. }); 10. setTimeout(() => console.log(6)); 11. console.log(7); // 7 2 4 3 6 5 1
microTasks 和 macroTasks。當程式碼開始執行時, 感謝您的閱讀!我希望您覺得這個部落格內容豐富且引人入勝。如果您發現任何不準確之處或有任何回饋,請隨時告訴我。
以上是事件循環——JavaScript的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱門文章

熱門文章

熱門文章標籤

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)