浅谈JavaScript宏任务和微任务执行顺序

浅谈JavaScript宏任务和微任务执行顺序

在 JavaScript 中,任务被分为 宏任务(macrotask)和 微任务(microtask)。而在 JavaScript 中,事件循环(event loop)来负责管理和执行这些任务。

宏任务(macrotask)

宏任务是 JavaScript 中较为常见的任务类型,包括以下几种:

  • 脚本本身;
  • 用户界面交互事件,如鼠标点击、键盘事件等;
  • setTimeout() 和 setInterval() 定时器;
  • XMLHttpRequest 网络请求;
  • postMessage 等。

微任务(microtask)

相比宏任务稍微不那么常见,但又极为重要的微任务在 JavaScript 中起着至关重要的作用,其执行顺序远远高于宏任务。常见的微任务包括:

  • Promise;
  • async / await;
  • process.nextTick(Node.js 的特有 API)。

任务的执行顺序

在 JavaScript 中,任务的执行顺序是由事件循环来管理和决定的。事件循环的机制是:当任务队列中有任务需要执行时,将队列中的任务按照添加顺序逐一取出并执行,以此往复,直到所有的任务都被处理完毕。

根据事件循环机制的规则,JavaScript 中宏任务的执行优先级要低于微任务,也就是说微任务会先于宏任务执行。但是需要注意的是,同一类型的任务(即宏任务间、或微任务间)之间的执行顺序是可以被保证的, 但是不同类型的任务(即宏任务与微任务)之间就不能保证执行顺序了。

例如,在以下代码中,先输出第二个 Promise 的结果,再输出第一个 Promise 的结果:

Promise.resolve().then(() => {
  console.log("Promise1");
  Promise.resolve().then(() => {
    console.log("Promise2");
  });
});

再例如,在以下代码中,先输出第一个 setTimeout 回调函数的结果,再输出第二个:

setTimeout(() => {
  console.log("setTimeout1");
  Promise.resolve().then(() => {
    console.log("setTimeout1-Promise");
  });
}, 0);

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

在上面例子中,setTimeout1先进入宏任务队列,紧接着Promise直接进入当前微任务队列,等当前微任务队列都处理完毕后才会从宏任务队列中取出setTimeout2处理。

在实际工作中,理解和把握好 JavaScript 任务的执行顺序,对于代码编写和效率提升非常重要。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈JavaScript宏任务和微任务执行顺序 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • javascript实现阻止iOS APP中的链接打开Safari浏览器

    要在iOS APP中实现阻止链接打开Safari浏览器的功能,可以通过以下方法实现: 1. 使用JavaScript 通过JavaScript代码可以控制链接的行为,让其在当前页面打开,而不是打开一个新的Safari浏览器页面。具体的代码实现如下: // 拦截所有超链接打开 safari document.addEventListener(‘click’, …

    JavaScript 2023年6月11日
    00
  • JavaScript 解析数学表达式的过程详解

    JavaScript 解析数学表达式的过程详解 什么是数学表达式? 数学表达式是包含算术,代数和其他运算符的数学表达式,通常用来计算结果。 在 JavaScript 中,我们可以使用 eval() 函数来解析和计算一个字符串中的数学表达式。 JavaScript 解析数学表达式的过程 创建一个字符串变量,并且在这个字符串变量中包含一个数学表达式。 let m…

    JavaScript 2023年5月28日
    00
  • JavaScript闭包原理与使用介绍

    JavaScript闭包原理与使用介绍 什么是闭包(Closure) 在 JavaScript 中,闭包(Closure)是指被包含在函数中的一个函数和其对外部变量的引用组合。 通俗地说,当一个函数访问其外部作用域中的变量时,就创建了一个闭包。 闭包的原理 在 JavaScript 中,每当创建一个函数时,都会为该函数创建一个作用域链(Scope Chain…

    JavaScript 2023年6月10日
    00
  • js Math数学简单使用操作示例

    下面是关于“js Math数学简单使用操作示例”的完整攻略。 一、Math对象概述 JavaScript的内置对象之一是Math对象,它包含了许多常见的数学函数和常量。Math主要对数字进行操作,例如数学运算、幂运算、三角函数等。 二、Math对象中的常用方法 下面是 Math 对象中一些常用方法的介绍: 1. Math.floor() Math.floor…

    JavaScript 2023年5月27日
    00
  • js创建表单元素并使用submit进行提交

    下面是创建表单元素并使用submit进行提交的完整攻略,由以下三个步骤组成: 步骤一:创建表单元素 创建表单元素需要使用JavaScript。我们可以使用DOM API来创建表单元素。首先,我们需要创建一个 元素。可以使用document.createElement()方法来创建。 const form = document.createElement(‘f…

    JavaScript 2023年6月10日
    00
  • 原生js实现淘宝购物车功能

    原生js实现淘宝购物车功能的攻略可以分为以下几个步骤: 步骤一:页面结构 首先,我们需要在页面中设置一个存放购物车商品的容器,并给它一个id,方便我们后续在JavaScript中获取到它的元素: <div id="cart-container"> </div> 步骤二:获取数据 接下来,我们需要从后台获取购物车中的…

    JavaScript 2023年6月11日
    00
  • JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支

    JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支 页面加载事件 window.onload window.onload事件是在文档(包括图像、CSS和其他资源)全部加载完成时触发的事件,用于在页面加载完成后执行一些初始化操作,比如加载一些需要资源的模块或者初始化一个需要在页面加载完毕后才能使用的插件。 window.onload = f…

    JavaScript 2023年6月10日
    00
  • 实例讲解JS中pop使用方法

    实例讲解JS中pop使用方法 pop()方法概述 pop()是JavaScript中数组的一个基本方法,该方法可用于删除数组中的最后一个元素,并返回该元素的值。 pop()方法的语法 数组对象.pop() 示例说明 示例一 下面的代码演示了如何使用pop()方法从一个数组中删除最后一个元素: var arr = ["apple", &qu…

    JavaScript 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部