JS中微任务和宏任务的区别

在 JavaScript 中,微任务(Microtask)和宏任务(Macrotask)是用来管理异步代码执行顺序的概念,它们之间有一些关键的区别:

  1. 宏任务(Macrotask)

    • 宏任务是由浏览器提供的任务源,常见的宏任务包括:script(整体代码)、setTimeout、setInterval、I/O、UI rendering 等。
    • 宏任务会进入到宏任务队列中,当执行栈为空时,事件循环会从宏任务队列中选择一个任务来执行。
    • 每个宏任务之间会存在一个时间间隔,也就是说,宏任务之间会互相等待,直到前一个宏任务执行完毕。
  2. 微任务(Microtask)

    • 微任务是在当前任务执行完毕后立即执行的任务,它可以看作是在当前任务的末尾添加的任务,以确保在下一个事件循环之前执行。
    • 常见的微任务包括:Promise 的 then 方法、MutationObserver 等。
    • 微任务会在当前任务执行结束后立即执行,而不需要等待下一个宏任务。

关键区别总结:

  • 调度时机不同:宏任务是在主线程上执行的任务,而微任务是在宏任务执行完毕之后立即执行的。
  • 执行顺序不同:微任务比宏任务优先级更高,当宏任务执行完毕后,会首先执行微任务队列中的任务,然后再执行下一个宏任务。
  • 来源不同:宏任务来自于浏览器提供的任务源,而微任务是由一些特定的API(比如 Promise)触发的。

举个例子:

javascript 复制代码
console.log('Start');

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

Promise.resolve().then(() => {
  console.log('Promise');
});

console.log('End');

以上代码中,主线程首先执行同步代码,输出 'Start' 和 'End'。然后,它遇到了一个宏任务 setTimeout 和一个微任务 Promise。根据事件循环的执行顺序,微任务优先级高于宏任务,所以微任务 Promise 首先执行,输出 'Promise'。接着,宏任务 setTimeout 执行,输出 'setTimeout'。

综上所述,微任务和宏任务在 JavaScript 中用于管理异步代码的执行顺序,它们之间的区别主要体现在调度时机、执行顺序和来源等方面。

相关推荐
fei_sun36 分钟前
面经、笔试(持续更新中)
fpga开发·面试
killerbasd1 小时前
牧苏苏传 我不装了 4/7
前端·javascript·vue.js
橘子编程2 小时前
JavaScript与TypeScript终极指南
javascript·ubuntu·typescript
叫我一声阿雷吧2 小时前
JS 入门通关手册(45):浏览器渲染原理与重绘重排(性能优化核心,面试必考
javascript·前端面试·前端性能优化·浏览器渲染·浏览器渲染原理,重排重绘·reflow·repaint
大家的林语冰3 小时前
《前端周刊》尤大开源 Vite+ 全家桶,前端工业革命启动;尤大爆料 Void 云服务新产品,Vite 进军全栈开发;ECMA 源码映射规范......
前端·javascript·vue.js
jiayong233 小时前
第 8 课:开始引入组合式函数
前端·javascript·学习
天若有情6734 小时前
【C++原创开源】formort.h:一行头文件,实现比JS模板字符串更爽的链式拼接+响应式变量
开发语言·javascript·c++·git·github·开源项目·模版字符串
Yuk丶4 小时前
UE4客户端开发技术问题汇总
面试·ue4·图形学·ue4客户端开发
yuki_uix4 小时前
重排、重绘与合成——浏览器渲染性能的底层逻辑
前端·javascript·面试
何陋轩5 小时前
OpenAI Codex深度解析:终端里的AI代码特工,一个指令重构整个项目
人工智能·面试