面試官:你有2分鐘的時間。向我解釋一下 JavaScript 事件循環(huán)。
我的回答是:接受挑戰(zhàn),走吧! ?
? 單線程執(zhí)行:
JavaScript 在單線程模型上運行,這意味著它一次只能處理一項任務。任務使用調(diào)用堆棧進行管理,調(diào)用堆棧逐一執(zhí)行函數(shù)。
? 調(diào)用堆棧:
將調(diào)用堆棧想象為一堆板。每次調(diào)用函數(shù)時,都會將一個盤子添加到堆棧中。一旦功能完成,盤子就會被移除。
? Web API:
對于 setTimeout、DOM 事件或 HTTP 請求等任務,JavaScript 使用瀏覽器提供的 Web API。這些任務是在調(diào)用堆棧之外處理的。
? 回調(diào)隊列:
一旦異步任務完成,其回調(diào)就會移至回調(diào)隊列。事件循環(huán)僅在堆棧為空時將回調(diào)推送到堆棧。
? 事件循環(huán):
事件循環(huán)充當看門人,檢查調(diào)用堆棧是否為空。當它是時,它從回調(diào)隊列中取出第一個任務并將其推入堆棧。
? 微任務隊列:
除了回調(diào)隊列之外,還有一個微任務隊列,用于處理 Promise 等任務。微任務在任何其他回調(diào)之前進行處理,從而賦予它們更高的優(yōu)先級。
? 優(yōu)先處理:
總而言之,事件循環(huán)首先檢查微任務隊列,然后繼續(xù)檢查回調(diào)隊列。這確保了關鍵任務(例如,promise)在其他回調(diào)之前執(zhí)行。
這就是 JavaScript 事件循環(huán)! ?
?保持好奇心,不斷學習,不斷分享! ??