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代码至关重要。

目录
相关文章
|
3月前
|
JavaScript 前端开发 API
详解队列在前端的应用,深剖JS中的事件循环Eventloop,再了解微任务和宏任务
该文章详细讲解了队列数据结构在前端开发中的应用,并深入探讨了JavaScript的事件循环机制,区分了宏任务和微任务的执行顺序及其对前端性能的影响。
|
24天前
|
设计模式 JavaScript 前端开发
js中new和object.creat区别
【10月更文挑战第29天】`new` 关键字和 `Object.create()` 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。
|
3月前
|
前端开发 JavaScript UED
JavaScript防抖和节流的使用及区别
JavaScript防抖和节流的使用及区别
105 57
|
2月前
|
存储 JavaScript 前端开发
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
JavaScript 数据类型分为基本数据类型和引用数据类型。基本数据类型(如 string、number 等)具有不可变性,按值访问,存储在栈内存中。引用数据类型(如 Object、Array 等)存储在堆内存中,按引用访问,值是可变的。本文深入探讨了这两种数据类型的特性、存储方式、以及检测数据类型的两种常用方法——typeof 和 instanceof,帮助开发者更好地理解 JavaScript 内存模型和类型检测机制。
87 0
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
|
2月前
|
存储 JavaScript 前端开发
js中函数、方法、对象的区别
js中函数、方法、对象的区别
20 2
|
2月前
|
JavaScript 前端开发
【JavaScript】let,const和var的区别
总的来说,随着ECMAScript 6(ES6)及后续版本的推广,`let`和 `const`因其增强的块级作用域和对变量行为的更严格控制,逐渐成为现代JavaScript编码实践中推荐使用的变量声明方式。而 `var`由于其历史遗留的局限性,正逐渐被边缘化,但在维护老代码或处理特定兼容性需求时仍需了解。
37 3
|
3月前
|
前端开发 JavaScript 开发者
React 和 Vue.js 框架的区别是什么?
React 和 Vue.js 框架的区别是什么?
|
3月前
|
JavaScript 前端开发
JavaScript中单引号和双引号的效果的一点区别
JavaScript中单引号和双引号的效果的一点区别
|
2月前
|
JavaScript 前端开发 调度
在JavaScript中异步任务里的微任务和宏任务的特点和生命周期
在JavaScript中异步任务里的微任务和宏任务的特点和生命周期
44 0
|
3月前
|
JavaScript 前端开发
JS基础 if和switch区别
本文比较了JavaScript中的`if`语句和`switch`语句的区别,并通过示例代码展示了它们的用法,解释了何时使用`if`更合适以及`switch`语句的特点和应用场景。
21 0