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