前端 JS 经典:宏任务、微任务、事件循环(EventLoop)

1. 前言概览

js 是一门单线程的非阻塞的脚本语言

单线程:只有一个主线程处理所有任务

非阻塞:有异步任务,主线程挂起这个任务,等异步返回结果再根据一定规则执行

2. 宏任务与微任务

javascript 复制代码
都是异步任务

宏任务:script 标签,setTimeout,setInterval,setImmediate,I/O,接口调用
微任务:process.nextTick,Promise.then() catch(),Async/Await,Object.observe

注意:Promise 本身是同步任务,then,catch,finally 是异步任务
async 中 await 右边代码是同步任务,之后代码是异步任务

3. 事件循环

主线程执行顺序:一个宏任务(script 标签)-> 同步任务 -> 微任务 -> 一个宏任务 -> 宏任务中的微任务(如果有) -> 下一个宏任务 -> ..... 直到 js 事件执行完成。

4. 经典案例

javascript 复制代码
async function async1(){
  console.log('1') // 同2
  await async2()
  console.log('2') // 微1
}
async function async2(){
  console.log('3') // 同3
}
console.log('4') // 同1
setTimeout(function(){
  console.log('5') // 宏1
},0)
setTimeout(function(){
  console.log('6') // 宏2
},3)
async1();
new Promise(function(resolve){
  console.log('7') // 同4
  resolve();
  console.log('8') // 同5
}).then(function(){
  console.log('9') // 微2
})
console.log('10') // 同6
// 输出:4,1,3,7,8,10,2,9,5,6
相关推荐
刺客-Andy12 小时前
JS中级面试题 50道及答案
开发语言·javascript·ecmascript
Mapmost12 小时前
【高斯泼溅】从“看清”到“看懂”,3DGS语义化让数字孪生“会说话”
前端
Java小白笔记12 小时前
BigDecimal用法示例
java·开发语言·spring boot
l1t12 小时前
Python 字符串反转方法
linux·开发语言·python
Eiceblue12 小时前
使用 Python 写入多类型数据至 Excel 文件
开发语言·python·excel
指尖跳动的光12 小时前
防止前端页面重复请求
前端·javascript
luquinn12 小时前
用canvas切图展示及标记在原图片中的位置
开发语言·前端·javascript
巧克力芋泥包12 小时前
前端vue3调取阿里的oss存储
前端
AAA阿giao12 小时前
React Hooks 详解:从 useState 到 useEffect,彻底掌握函数组件的“灵魂”
前端·javascript·react.js
RedHeartWWW12 小时前
Next.js Middleware 极简教程
前端