Web前端入門:JavaScript 事件循環機制中的微任務與宏任務

JS 是單線程語言。這句話對不對?

按照目前的情況來看,JS 自從支持了?Web Worker?之后,就不再是單線程語言了,但 Worker 的工作線程與主線程有區別,在 Worker 的工作線程中無法直接操作 DOM、window 對象或大多數瀏覽器 API(如 localStorage),Worker 的全局對象也不再是 window 對象,而是 self。

Worker 中的事件循環與主線程相互獨立,互不影響,但執行順序還是得遵循 JS 的語法規則。

宏任務

宏任務表示執行時間較長的任務,在每次時間循環時只會執行一個宏任務,執行完畢后處理微任務隊列,所有微任務都執行完畢后進入下一個宏任務。

JS 常見宏任務類型:

  1. 定時器任務:setTimeout / setInterval

  2. DOM 事件回調(如 click、scroll)

  3. I/O 操作(如文件讀取、網絡請求)

  4. 瀏覽器用于執行動畫的方法?requestAnimationFrame?,執行時機與渲染相關

  5. Node.js 環境的?setImmediate

  6. script 標簽內主線程的同步代碼(整體作為一個宏任務)

微任務

微任務表示更輕量的異步任務,當宏任務執行完畢之后立即執行。

JS 常見微任務類型:

  1. Promise.then()?/?Promise.catch()?/?Promise.finally()

  2. 瀏覽器監聽 DOM 變化的 API 對象,比如:MutationObserver

  3. 手動添加微任務API方法:queueMicrotask()

  4. nodejs 中的?process.nextTick()

代碼解析

看這么一段代碼:

(function() {console.log(1)setTimeout(() => { console.log(2); });queueMicrotask(() => console.log(3))new Promise(resolve => {console.log(4);setTimeout(() => {resolve();console.log(5);}, 0);Promise.resolve().then(() => console.log(6));console.log(7);}).then(() => {console.log(8);Promise.resolve().then(() => console.log(9));});console.log(10);
})();

分析代碼:

(function() {console.log(1) // 同步任務setTimeout(() => { console.log(2); });queueMicrotask(() => console.log(3))new Promise(resolve => {console.log(4); // 同步任務setTimeout(() => { // 宏任務resolve(); // 宏任務的同步任務console.log(5); // 宏任務中的同步任務}, 0);Promise.resolve().then(() => console.log(6)); // 微任務console.log(7); // 同步任務}).then(() => { // 微任務console.log(8); // 微任務中的同步任務Promise.resolve().then(() => console.log(9)); // 微任務中的微任務});console.log(10); // 同步任務
})();

第一輪

首先同步代碼的宏任務優先級最高,不管微任務還是宏任務,同步代碼都會先執行。

所以上面代碼會優先執行:

console.log(1)
console.log(4);
console.log(7);
console.log(10);

接著開始處理微任務:

queueMicrotask(() => console.log(3))
Promise.resolve().then(() => console.log(6));

微任務處理完,開始執行下一輪宏任務。

第二輪

這一輪中的宏任務只有一個 setTimeout,執行完之后由于沒有微任務隊列,所以直接執行下一輪宏任務。

setTimeout(() => { console.log(2); });

第三輪

這一輪的宏任務中有同步代碼。

setTimeout(() => { // 宏任務resolve(); // 宏任務的同步任務console.log(5); // 宏任務中的同步任務
}, 0);

在執行完?resolve()?之后,會將 Promise.then 的回調函數放入微任務隊列中,所以在宏任務執行完之后會開始微任務:

then(() => { // 微任務console.log(8); // 微任務中的同步任務Promise.resolve().then(() => console.log(9)); // 微任務中的微任務
})

最終的打印順序

1
4
7
10
3
6
2
5
8
9

執行流程圖

JS 代碼逐行執行,在遇到宏任務時,整個代碼塊丟到宏任務隊列,在遇到微任務時,將微任務丟到本次事件循環中的微任務隊列,本次事件循環執行完之后,再執行微任務隊列中的任務,微任務執行完之后開始下一個宏任務執行。

JS 代碼執行機制:

宏任務執行機制:

寫在最后

JS 中的代碼執行流程永遠都是事件循環機制,這是 JS 的任務調度核心,理解事件循環機制,才能在開發中游刃有余~~

文章轉載自:前端路引

原文鏈接:Web前端入門第 68 問:JavaScript 事件循環機制中的微任務與宏任務 - 前端路引 - 博客園

體驗地址:JNPF快速開發平臺

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88316.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88316.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88316.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【論文筆記】【強化微調】TinyLLaVA-Video-R1:小參數模型也能視頻推理

[2504.09641] TinyLLaVA-Video-R1: Towards Smaller LMMs for Video Reasoning 1. 引述 繼之前的一篇 Video-R1 的工作,一篇新的關于視頻推理的工作很快就上傳到 Arxiv 上 “占坑” 了,這個工作是關于使用小參數(3B)的 LLM 進行視…

基于元學習的回歸預測模型如何設計?

1. 核心設計原理 目標:學習一個可快速適應新任務的初始參數空間,使模型在少量樣本下泛化。數學基礎: MAML框架: min ? θ ∑ T ~ p ( T ) [ L T ( f θ ? η ? θ L T ( f θ ( D T t r a i n ) ) ( D T t e s t ) ) ] \min…

MyBatis Plus與P6Spy日志配置

前言 在開發基于Spring Boot和MyBatis Plus的項目時,日志功能是調試和優化SQL查詢的核心工具。通過合理配置日志輸出,開發者可以直觀查看生成的SQL語句、執行時間、參數值以及潛在的性能瓶頸。 一、MyBatis Plus日志配置 1.1 基礎配置:直接…

SpringCloudGateway(spel)漏洞復現 Spring + Swagger 接口泄露問題

環境配置 gateway Spring Cloud : 這個就是分布式的微服務組件 微服務 : 一般指的是獨立的,專注于一項功能的服務 Gateway 這個其實是個云端的網關配置(他的作用就是對訪問web的流量進行防護比如一些爬蟲的阻截&#xff0…

服務器手動安裝并編譯R環境庫包:PROJ→RGDAL

目錄 方式1:conda-forge安裝錯誤:缺乏libnsl.so.1? 方法一:查找系統中是否已有此庫替補方案:采用libnsl.so.3鏈接 libnsl.so.1? 方法二:系統中沒有安裝 libnsl.so.1 → 手動安裝? 方法三:使用 Conda 安裝…

教育技術學讀計算機論文的提示詞

角色: 你是一位經驗豐富的計算機專業教授,擅長用通俗易懂的語言向初學者解釋復雜概念。我現在正在學習閱讀計算機科學領域的算法論文,但我的基礎比較薄弱(了解編程基礎如變量、循環、函數,了解一點數據結構和算法概念如數組、鏈表、排序,但對高級術語和數學證明不熟悉)。…

棋盤格標定板和圓形標定板的優劣性

來源:deepseek 在相機標定中,棋盤格標定板和圓形標定板(或圓點陣列標定板)是最常用的兩種類型。它們各有優劣,選擇哪種取決于具體的應用場景、需求以及使用的標定算法。以下是它們的主要優劣對比: &#…

2025年UDP洪水攻擊防御指南:從7.3Tbps攻防戰看原理與實戰

45秒37.4TB流量!一場刷新歷史紀錄的DDoS攻擊正在顛覆傳統防御體系 一、什么是UDP洪水攻擊? UDP洪水攻擊(UDP Flood)是一種利用用戶數據報協議(UDP) 的無連接特性發起的分布式拒絕服務(DDoS&…

一種集成統計、視覺和基于規則方法的新型可解釋醫學圖像分類人工智能框架|文獻速遞-最新論文分享

Title 題目 A novel explainable AI framework for medical image classificationintegrating statistical, visual, and rule-based methods 一種集成統計、視覺和基于規則方法的新型可解釋醫學圖像分類人工智能框架 01 文獻速遞介紹 人工智能(AI)…

洛谷 P10113 [GESP202312 八級] 大量的工作溝通-普及/提高-

題目描述 某公司有 N N N 名員工,編號從 0 0 0 至 N ? 1 N-1 N?1。其中,除了 0 0 0 號員工是老板,其余每名員工都有一個直接領導。我們假設編號為 i i i 的員工的直接領導是 f i f_i fi?。 該公司有嚴格的管理制度,每位…

數組題解——移除元素?【LeetCode】

27. 移除元素 快慢指針法 算法思路 使用雙指針(fast和slow)遍歷數組。 fast指針遍歷每一個元素。slow指針指向下一個將被保留的位置。 如果nums[fast] ! val,就把nums[fast]賦值到nums[slow],并將slow向前移動一位。遍歷結束后…

ubuntu20.04安裝多版本python時,如何使用sudo python3.10

sudo 命令只會加載基本的path和動態庫,自己定義的不會加入,因此會出現使用sudo運行多版本python出現奇怪的現象,進行如下操作就可以使用 sudo vi ~/.bashrc alias sudosudo env PATH$PATH LD_LIBRARY_PATH$LD_LIBRARY_PATH 使用 sudo visud…

統計學純基礎(1)

?統計分析分為統計描述與統計推斷,統計推斷分為總體估計與假設檢驗 🏂16:45 醫學研究--基礎研究、轉化醫學研究、臨床研究 臨床研究--病因學研究、診斷準確性試驗、預后研究、療效研究 一般認為3個月以內的預后屬于近期預后,…

接口自動化測試之pytest 運行方式及前置后置封裝

🍅 點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快 一、Pytest 優點認知 1.可以結合所有的自動化測試工具 2.跳過失敗用例以及失敗重跑 3.結合allure生產美觀報告 4.和Jenkins持續集成 5.很多強大的插件 pytest-htm…

利用folium實現全國高校分布地圖顯示

智匯中國 | 揭秘!一張地圖帶你遨游全國高校殿堂 大家好,這期我們來利用folium模塊實現全國高校分布的地圖顯示。 什么是Folium Folium為Python用戶提供了便捷的方式來利用Leaflet.js的強大地圖可視化功能,而無需直接編寫JavaScript代碼。它允許開發者以Pythonic的方式處理…

【和春筍一起學C++】(二十二)C++函數新特性——函數重載

目錄 函數重載的含義 重載函數使用注意事項 幾種特殊情況 函數重載的含義 函數重載使得能夠用不同的參數列表調用多個同名的函數。可以通過函數重載設計一系列函數,它們完成相同的工作,但使用不同的參數列表。 函數重載的關鍵是函數的參數列表——也被稱為函數特征標。如…

CrewAI多智能體框架的實操教程-旅行規劃-2

1、創建一個新的 CrewAI 項目 surprise_trip crewai create crew surprise_trip 選擇模型廠商和模型 生成.env MODELgpt-4o OPENAI_API_KEY你的api_keySERPER_API_KEY你的SERPER api_key 2、探索項目結構 3、配置代理 修改 agents.yaml文件。 # 個性化活動規劃師 Agent p…

vue腳手架與前后端交互

前言 。Vue.js作為一種流行的前端框架,提供了豐富的功能和靈活的架構,方便了開發者進行高效的開發。為了更好地使用Vue,Vue CLI(腳手架工具)成為了開發者進行項目創建和管理的重要工具。本文將結合Vue腳手架的使用場景…

【麻省理工】《how to speaking》筆記

【【麻省理工】《如何說話》一節課教你成為表達的王者】 開始 在演講最開始的時候,你要告訴觀眾,在接下來的15分鐘或一個小時之內,他們將會學到什么東西。這會讓觀眾集中注意力去傾聽。 PPT 你的幻燈片上的字要越少越好。因為聽眾的大腦一…

ESP32-HTML-08

一、html顯示圖片 1.工程包含Html需要顯示的圖片 2、CMakeLists.txt包含圖片資源 舉例&#xff1a; idf_component_register(SRCS main.cEMBED_FILES root.html favicon.ico) 3.html中圖片的標簽 <img src"motus.ico"> 4.后臺代碼的添加 static esp_e…