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

目录
相关文章
|
JavaScript 前端开发 容器
this、self、window、top 在 JavaScript 中的区别深入研究
在 JavaScript 开发中,`this`、`self`、`window` 和 `top` 是四个常用的概念。`this` 指向当前执行上下文的对象,其值取决于函数调用方式;`self` 在全局作用域中等同于 `window`,常用于 Web Workers;`window` 代表浏览器窗口,是全局变量的容器;`top` 指向最顶层窗口,用于判断是否在框架中。理解这些概念有助于编写健壮的代码。
468 1
this、self、window、top 在 JavaScript 中的区别深入研究
|
JavaScript 前端开发
Node.js 中实现多任务下载的并发控制策略
Node.js 中实现多任务下载的并发控制策略
462 15
|
移动开发 运维 供应链
通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
array.some()可以用来权限检查、表单验证、库存管理、内容审查和数据处理等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
供应链 JavaScript 前端开发
通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
array.every()可以用来数据验证、权限检查、一致性检查等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
551 1
|
设计模式 JavaScript 前端开发
js中new和object.creat区别
【10月更文挑战第29天】`new` 关键字和 `Object.create()` 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。
|
存储 JavaScript 前端开发
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
JavaScript 数据类型分为基本数据类型和引用数据类型。基本数据类型(如 string、number 等)具有不可变性,按值访问,存储在栈内存中。引用数据类型(如 Object、Array 等)存储在堆内存中,按引用访问,值是可变的。本文深入探讨了这两种数据类型的特性、存储方式、以及检测数据类型的两种常用方法——typeof 和 instanceof,帮助开发者更好地理解 JavaScript 内存模型和类型检测机制。
669 0
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
|
存储 JavaScript 前端开发
js中函数、方法、对象的区别
js中函数、方法、对象的区别
359 2
|
JavaScript 前端开发
【JavaScript】let,const和var的区别
总的来说,随着ECMAScript 6(ES6)及后续版本的推广,`let`和 `const`因其增强的块级作用域和对变量行为的更严格控制,逐渐成为现代JavaScript编码实践中推荐使用的变量声明方式。而 `var`由于其历史遗留的局限性,正逐渐被边缘化,但在维护老代码或处理特定兼容性需求时仍需了解。
329 3
下一篇
开通oss服务