JavaScript 的宏任务和微任务有什么区别

简介: 【9月更文挑战第6天】JavaScript 的宏任务和微任务有什么区别

JavaScript中的宏任务(Macrotasks)和微任务(Microtasks)是管理异步代码执行顺序的两个重要概念,它们之间存在明显的区别。以下是它们的主要区别:

1. 调度时机和执行顺序

  • 宏任务:宏任务是由浏览器提供的任务源,常见的宏任务包括script(整体代码)、setTimeoutsetInterval、I/O操作、UI渲染等。宏任务会进入到宏任务队列中,当执行栈为空时,事件循环会从宏任务队列中选择一个任务来执行。每个宏任务之间会存在一个时间间隔,即宏任务之间会互相等待,直到前一个宏任务执行完毕。
  • 微任务:微任务是在当前任务执行完毕后立即执行的任务,可以看作是在当前任务的末尾添加的任务,以确保在下一个事件循环之前执行。常见的微任务包括Promisethen/catch/finally方法、MutationObserver等。微任务会在当前宏任务执行结束后立即执行,而不需要等待下一个宏任务。

2. 优先级

  • 微任务的优先级高于宏任务。当宏任务执行完毕后,会首先执行微任务队列中的任务,然后再执行下一个宏任务。

3. 来源

  • 宏任务:宏任务来自于浏览器提供的任务源,如定时器、I/O操作等。
  • 微任务:微任务是由一些特定的API触发的,如PromiseMutationObserver等。

4. 生命周期和特性

  • 宏任务:每个事件循环的开始处执行一个宏任务,执行过程中可能会产生新的微任务。宏任务之间会存在时间间隔,允许其他任务(如UI渲染)在宏任务之间执行。
  • 微任务:在每个宏任务执行完毕后立即执行,直到微任务队列清空。微任务的执行可以产生新的微任务,这些新生成的微任务也会在当前事件循环迭代中执行。

5. 示例和执行顺序

假设有以下代码:

console.log('1');

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

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

console.log('4');

执行顺序将是:

1
4
3
2

解释:

  1. 首先执行同步代码,输出14
  2. 然后,setTimeout被推入宏任务队列,Promise.resolve().then()的回调函数被推入微任务队列。
  3. 同步代码执行完毕后,开始执行微任务队列中的任务,输出3
  4. 所有微任务执行完毕后,开始执行宏任务队列中的setTimeout,输出2

综上所述,宏任务和微任务在JavaScript中用于管理异步代码的执行顺序,它们之间的区别主要体现在调度时机、执行顺序、优先级、来源以及生命周期等方面。理解这些区别对于编写高效、可预测的异步JavaScript代码至关重要。

目录
相关文章
|
11天前
|
JavaScript 前端开发 API
详解队列在前端的应用,深剖JS中的事件循环Eventloop,再了解微任务和宏任务
该文章详细讲解了队列数据结构在前端开发中的应用,并深入探讨了JavaScript的事件循环机制,区分了宏任务和微任务的执行顺序及其对前端性能的影响。
|
25天前
|
前端开发 JavaScript UED
JavaScript防抖和节流的使用及区别
JavaScript防抖和节流的使用及区别
92 57
|
3天前
|
JavaScript 前端开发
【JavaScript】let,const和var的区别
总的来说,随着ECMAScript 6(ES6)及后续版本的推广,`let`和 `const`因其增强的块级作用域和对变量行为的更严格控制,逐渐成为现代JavaScript编码实践中推荐使用的变量声明方式。而 `var`由于其历史遗留的局限性,正逐渐被边缘化,但在维护老代码或处理特定兼容性需求时仍需了解。
9 3
|
11天前
|
JavaScript 前端开发
JavaScript中单引号和双引号的效果的一点区别
JavaScript中单引号和双引号的效果的一点区别
|
15天前
|
前端开发 JavaScript 开发者
React 和 Vue.js 框架的区别是什么?
React 和 Vue.js 框架的区别是什么?
|
14天前
|
JavaScript 前端开发
JS基础 if和switch区别
本文比较了JavaScript中的`if`语句和`switch`语句的区别,并通过示例代码展示了它们的用法,解释了何时使用`if`更合适以及`switch`语句的特点和应用场景。
15 0
|
1月前
|
存储 JavaScript 前端开发
|
3月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
78 2
|
3月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
68 4