js 同步异步,宏任务微任务的关系

一、先分清:同步 vs 异步

1. 同步(Sync)

  • 代码按顺序执行
  • 必须等上一行执行完,才能执行下一行
  • 会阻塞代码
  • 例子:for 循环、普通赋值、console.log、计算
js 复制代码
console.log(1)
console.log(2)
console.log(3)
// 输出:1 2 3

2. 异步(Async)

  • 不会立刻执行,先放到"任务队列"
  • 所有同步代码执行完,才会执行异步
  • 不阻塞代码
  • 例子:定时器、ajax/fetch、Promise、事件
js 复制代码
console.log(1)
setTimeout(() => console.log(2), 0)
console.log(3)
// 输出:1 3 2

二、核心重点:宏任务(Macrotask) vs 微任务(Microtask)

JS 异步任务分两类:宏任务微任务

执行规则(死记硬背)

  1. 先执行所有同步代码
  2. 再执行所有微任务
  3. 最后执行宏任务

口诀:
同步 → 微任务 → 宏任务


三、哪些是宏任务?哪些是微任务?

宏任务(慢)

  • setTimeout
  • setInterval
  • Ajax/fetch
  • 事件监听(click、resize)
  • requestAnimationFrame
  • UI 渲染

微任务(快)

  • Promise.then / catch / finally
  • async/await(本质就是 Promise)
  • queueMicrotask
  • Vue nextTick
  • Vue 的 DOM 更新、watch 回调

四、最经典的执行顺序题(必看)

js 复制代码
console.log('1 同步')

setTimeout(() => {
  console.log('2 宏任务')
}, 0)

Promise.resolve().then(() => {
  console.log('3 微任务')
})

console.log('4 同步')

输出结果:

复制代码
1 同步
4 同步
3 微任务
2 宏任务

五、完整执行流程(底层原理)

  1. 执行同步代码
  2. 同步执行完 → 清空所有微任务
  3. 微任务清空 → 执行一个宏任务
  4. 宏任务执行完 → 又清空所有微任务
  5. 循环往复...

六、和 Vue 的关系(超级重要)

  • Vue 异步更新 DOM
  • nextTick
  • watch 的 flush

全部都是 微任务!

所以 Vue 事件循环顺序:
同步代码 → Vue DOM 更新(微任务)→ nextTick(微任务)→ 宏任务(setTimeout)


七、超级总结(必背)

  1. 同步先跑,异步后跑
  2. 异步分两种:微任务 > 宏任务
  3. 执行顺序:同步 → 微任务 → 宏任务
  4. Promise/await/nextTick 是微任务
  5. setTimeout/ajax 是宏任务

一句话终极记忆

同步最先,微任务中间,宏任务最后!

需要我给你出 3 道前端面试必考的执行顺序题 让你练手吗?一做就彻底吃透。

相关推荐
程序员-Benothing5 分钟前
Java集合:List实现类深度对比
java·开发语言·后端·面试·list
酷在前行13 分钟前
【R论文复刻】Nature Communications 冲积图进阶:状态转移、流带排序与多面板排版(保姆级教程)
开发语言·r语言
减瓦27 分钟前
用 Git 为本地文件打造一台时光机
开发语言·git·编辑器
冻柠檬飞冰走茶36 分钟前
PTA基础编程题目集 7-37 整数分解为若干项之和(C语言实现)
c语言·开发语言·数据结构·算法
晓得迷路了40 分钟前
栗子前端技术周刊第 140 期 - pnpm、Node 新 API 文档网站、Oxlint...
前端·javascript·node.js
烬羽1 小时前
一个队列,怎么让滑动窗口从 O(nk) 变 O(n)?单调队列彻底搞懂
javascript·数据结构·算法
末代iOS程序员华仔1 小时前
OPC + Flutter + Swift:跨平台应用上架与专业知识点获客实战指南
开发语言·flutter·swift
脚踏实地皮皮晨1 小时前
003004002_UniformGrid控件的使用方法
开发语言·c#·.net·wpf·visual studio
j7~2 小时前
【Linux】二十六.线程篇三《Linux多线程编程:线程控制、线程ID以及进程地址空间分布、线程局部存储__thread以及clone系统调用》---详解
linux·运维·服务器·开发语言·c++·多线程编辑·线程的控制
维吉斯蔡10 小时前
【VS Code / Cursor】文件夹右键快捷打开与文件类型自动关联
开发语言·程序人生·学习方法