宏任务和微任务

事件循环概述

事件循环(Event Loop)是JavaScript 引擎用来处理异步任务的一种机制,主要由主线程任务队列组成。

js代码可分为同步任务异步任务同步任务主线程 顺序执行,而异步任务由异步进程处理后将回调函数放入任务队列,等待主线程读取调用。

主线程执行完当前的同步任务后,不断读取调用任务队列的回调函数,直到清空任务队列,该循环机制称为事件循环

宏任务和微任务

异步任务分为 宏任务(Macro task)微任务(micro task)

宏任务 (Macrotask) 微任务 (Microtask)
script(整体代码块) Promise.then/catch/finally
setTimeout async await
setInterval queueMicrotask
setImmditate MutationObserver(监听器)
I/O,事件队列 process.nextTick
requestAnimationFrame(争议)

宏任务:代表着 JavaScript 运行时环境中的一个主要工作单元,类似一个载体。

微任务 :运行依托于宏任务,执行优先级高于同轮次的宏任务。

代码执行过程如下:

  1. 进入宏任务
  2. 执行所有同步代码,将异步任务放入对应的任务队列
  3. 执行微任务队列中的回调函数
  4. 从宏任务队列中取出下一个宏任务
  5. 重复上述步骤

举个栗子

javascript 复制代码
async function test() {
    await console.log(8);
    console.log(9);
}

console.log(1);

test();

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

new Promise((resolve) => {
    console.log(4);
    resolve();
    console.log(5);
}).then(() => {
    console.log(6);
});

console.log(7);

执行顺序:

1--> 8--> 4--> 5--> 7--> 9--> 6--> 2


再举个栗子

javascript 复制代码
async function test() {
    await console.log(1);
    console.log(2);
}

console.log(3);

test();

setTimeout(() => {
	console.log(4);
}, 0);

new Promise((resolve) => {
    console.log(5);
    resolve();
}).then(async () => {
    await console.log(6);
    console.log(7);
}).then(() => {
    console.log(8);
});

new Promise((resolve) => {
    console.log(9);
    resolve();
}).then(() => {
    console.log(10);
    setTimeout(() => {
        console.log(11);
    });
}).then(() => {
    console.log(12);
});

执行顺序:

3--> 1--> 5--> 9--> 2--> 6--> 10--> 7--> 12--> 8--> 4--> 11

相关推荐
SuperEugene31 分钟前
Axios 接口请求规范实战:请求参数 / 响应处理 / 异常兜底,避坑中后台 API 调用混乱|API 与异步请求规范篇
开发语言·前端·javascript·vue.js·前端框架·axios
子兮曰1 小时前
Bun v1.3.11 官方更新全整理:新增功能、关键修复与升级验证
javascript·node.js·bun
Setsuna_F_Seiei1 小时前
AI 对话应用之页面滚动交互的实现
前端·javascript·ai编程
wefly20172 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
小江的记录本2 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
寂静or沉默3 小时前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
kyriewen113 小时前
给浏览器画个圈:CSS contain 如何让页面从“卡成PPT”变“丝滑如德芙”
开发语言·前端·javascript·css·chrome·typescript·ecmascript
英俊潇洒美少年4 小时前
react19和vue3的优缺点 对比
前端·javascript·vue.js·react.js
studyForMokey5 小时前
【Android面试】Activity生命周期专题
android·面试·职场和发展
~无忧花开~5 小时前
React生命周期全解析
开发语言·前端·javascript·react.js·前端框架·react