JavaScript进阶教程 - 宏任务和微任务

在JavaScript的事件循环中,任务被分为两大类:宏任务(Macro-tasks)和微任务(Micro-tasks)。这两类任务决定了JavaScript代码的执行顺序以及何时进行UI渲染、事件处理等。

宏任务(Macro-tasks)

宏任务是指在下一个事件循环迭代中执行的任务。每次执行栈清空时,事件循环都会从宏任务队列中取出一个宏任务来执行。常见的宏任务包括:

  • setTimeout
  • setInterval
  • setImmediate (主要在Node.js中使用)
  • I/O 操作
  • UI 渲染(浏览器环境)

当一个宏任务执行完成后,浏览器可以选择进行UI渲染,然后事件循环会检查是否有微任务需要执行。

微任务(Micro-tasks)

微任务通常是需要立即执行的短小任务,它们在当前事件循环迭代的末尾执行,但在下一个宏任务开始之前。这意味着微任务的执行优先级高于宏任务。常见的微任务包括:

  • Promise.thenPromise.catchPromise.finally 回调
  • MutationObserver 回调
  • process.nextTick (Node.js)

当当前宏任务执行完毕后,事件循环会执行所有队列中的微任务。只有当微任务队列完全清空后,事件循环才会移动到下一个宏任务。

执行顺序

  1. 执行一个宏任务(从宏任务队列中取出)
  2. 执行所有微任务(依次从微任务队列中取出,直到队列清空)
    • 在执行微任务期间产生的新的微任务也会被添加到队列中,并在当前事件循环迭代中执行
  3. 可能的UI渲染
  4. 重复上述步骤,执行下一个宏任务

示例

console.log('脚本开始'); // 同步代码,立即执行

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

Promise.resolve().then(() => {
    console.log('Promise 1'); // 微任务 1
}).then(() => {
    console.log('Promise 2'); // 微任务 2
});

console.log('脚本结束'); // 同步代码,立即执行

执行顺序将是:

  1. “脚本开始”
  2. “脚本结束”
  3. “Promise 1”(所有同步任务完成后,执行微任务)
  4. “Promise 2”(上一个微任务完成后,继续执行微任务)
  5. “setTimeout”(所有微任务完成后,执行下一个宏任务)

重要性

理解宏任务和微任务以及它们在事件循环中的角色对于编写高效且响应良好的JavaScript代码至关重要。这有助于开发者优化应用性能,避免潜在的性能瓶颈,并确保异步操作的正确顺序。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

终将老去的穷苦程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值