91网首页-91网页版-91网在线观看-91网站免费观看-91网站永久视频-91网站在线播放

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

JS事件循環講了 100 遍,這次你終于能真的搞懂了

freeflydom
2025年5月13日 14:9 本文熱度 660

? 寫在前面:你不是不懂,是沒真正吃透

事件循環 幾乎是前端人繞不過的坎,但也總是似懂非懂。

你可能已經:

  • 看了 5 張不同的流程圖
  • 刷了 3 遍教學視頻
  • 背過“宏任務和微任務”規則

但真正遇到面試題,比如:

Promise.then 和 setTimeout 誰先執行? async/await 究竟屬于哪類任務? process.nextTick 和 queueMicrotask 誰優先?

腦子還是“嗡”的一下。

這篇文章就是為了讓你 真正理解,而不是記答案。


?? 一句話解釋事件循環:JS 是單線程,但支持異步

JavaScript 是 單線程運行時:一次只能執行一個任務。

但我們又能寫異步邏輯:比如定時器、網絡請求、用戶操作。JS 怎么做到“非阻塞”呢?

答案就是:事件循環機制(Event Loop)

那它是怎樣執行的呢?

JS 引擎從任務隊列中不斷地調度任務 —— 執行一個宏任務 → 清空微任務 → 繼續下一輪宏任務。

  • 主線程:JS 的唯一運行通道,只能同時跑一個任務。
  • 執行棧:任務正在執行時,代碼的“調用路徑”。
  • 任務隊列:未來要執行的代碼排隊等待。

主線程中,存在:

  • 同步任務:立即執行的代碼(如 console.log()
  • 異步任務:不會立即執行,注冊后進入 任務隊列 等待,由瀏覽器安排時間再執行(如 setTimeout()

所有異步任務都要依賴事件循環調度!

一圖看懂 JS 執行順序:

那么哪些是宏任務、哪些又是微任務呢?

?? 宏任務 vs 微任務

類型常見任務來源什么時候執行
宏任務setTimeoutsetIntervalUI 渲染MessageChannel一輪事件循環的起點
微任務Promise.thenqueueMicrotaskMutationObserver當前宏任務執行完立即執行

記住:一個宏任務執行完 → 清空所有微任務 → 執行下一個宏任務

?? 那 Web Worker 屬于什么任務?

直接給結論,Web Worker 屬于獨立線程運行,不占用主線程時間。

但是需要注意:

Worker發回的消息會被主線程當作 普通的宏任務 處理(和setTimeout同級)

// 主線程
console.log("1. 開始炒菜");
const worker = new Worker("worker.js");
worker.postMessage("切土豆絲"); // 讓Worker去干活
worker.onmessage = (e) => {
  console.log("4. 收到切好的土豆絲"); // 主線程在宏任務中處理消息
};
console.log("2. 炒菜中...");
setTimeout(() => { console.log("3. 定時器任務"); }, 0);
// worker.js
self.onmessage = (e) => {
  // 模擬耗時計算
  for (let i=0; i<1e9; i++) {} // Worker線程卡死,但主線程不卡!
  self.postMessage("切好了");
};

輸出順序: 1 → 2 → 3 → 4(Worker計算耗時,但主線程不等待,先執行其他宏任務)

?? 舉幾個栗子徹底理解輸出順序

1. 來個簡單的練練手

console.log(1);
setTimeout(() => console.log(2), 0);
Promise.resolve().then(() => console.log(3));
console.log(4);

輸出順序: 1 → 4 → 3 → 2

執行過程:

  1. 執行同步任務:console.log(1)
  2. 注冊 setTimeout(宏任務),加入任務隊列
  3. Promise.then() 加入微任務隊列
  4. 執行同步任務:console.log(4)
  5. 清空微任務:輸出 3
  6. 下一輪宏任務:輸出 2

2. async/await 屬于什么任務?

async function test() {
  console.log('a');
  await Promise.resolve();
  console.log('b');
}
test();
console.log('c');

輸出順序: a → c → b

拆解說明:

  • await 會將 console.log('b') 拆成一個微任務
  • 所以整個 async 函數執行到 await 暫停,主線程繼續跑 console.log('c')
  • 主線程執行完后 → 微任務觸發 → 輸出 b

3. 來道高頻面試題試試手

先不看答案自己嘗試解答

console.log('script start');
setTimeout(() => {
  console.log('setTimeout');
}, 0);
Promise.resolve()
  .then(() => {
    console.log('promise1');
    return Promise.resolve();
  })
  .then(() => {
    console.log('promise2');
  });
queueMicrotask(() => {
  console.log('queueMicrotask');
});
console.log('script end');

拆解過程:

  • 先執行同步任務 console.log('script start')
  • 注冊 setTimeout(宏任務),加入任務隊列
  • Promise.then() 加入微任務隊列(promise1
  • promise2 屬于 promise1 微任務執行完成后才執行,所以先觀察下面還有沒有別的微任務
  • queueMicrotask 加入微任務隊列
  • 執行同步任務 console.log('script end')

執行結果:

script start  
script end  
promise1  
queueMicrotask  
promise2  
setTimeout

你有沒有答對呢...

?? 面試怎么答才顯得專業?

? 面試官:“你能解釋下 JS 的事件循環嗎?”

你可以這樣答:

  • 事件循環是 JS 控制異步執行順序的機制。
  • 所有任務分為同步任務和異步任務。異步任務進一步劃分為宏任務和微任務。
  • JS 每一輪事件循環會執行一個宏任務,執行完后清空所有微任務。
  • 微任務優先于下一輪宏任務執行,所以 Promise.then 總是先于 setTimeout。
  • async/await 本質上是 Promise 的語法糖,會拆成兩個微任務。

下次在面試中再被問到就應該 自信吟唱 了。??

?? 小結:寫給自己復習用

知識點要點
事件循環機制宏任務 → 微任務 → 下一輪宏任務
同步任務立即執行的代碼
異步任務注冊進隊列等待(分宏/微任務)
微任務Promise.thenqueueMicrotask,總是在宏任務后立即執行
async/await會被拆成 .then() 形成的微任務
Web Worker提供多線程能力,但與主線程隔離,靠 postMessage 通信
面試答法清晰區分同步/異步 + 宏/微任務 + 舉例輸出順序

轉自https://juejin.cn/post/7501880110837907508


該文章在 2025/5/13 14:09:05 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 中文字幕开心激情 | 不卡免费国产 | 欧美日韩在线视频 | 国产v视频 | 欧美一级大黄特黄 | 国产免费一区二 | 99热精品在线观看 | 日韩VA在线 | 国产午夜无 | 中文字幕亚洲第一 | 国产精品亚洲专 | 日韩在线观看视频黄 | www国产| 91福利视 | 日本久本草 | 日韩成人成色 | 区二区动态图 | 日韩欧美另类亚洲 | 丝袜在线播放 | 国产玖玖在线观看 | 成人a网站 | 精品电影日韩亚洲 | 成人一区二区在线 | 国产免费| 精品免费一 | 日本网站在线播放 | 91高清国 | 欧美在线日韩精品 | 制服欧美| 日韩a一级| 精品一区二区在线视 | 欧美性爱插插网络 | 欧美在线激情视频 | 欧美午夜在线观看 | 成人免费区一区二 | 91页在线视频 | 国产美女精品在线 | 国产在线拍揄 | 青青综合 | 国产精品成人国产乱 | 日韩在线欧美精 |