浅谈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日

相关文章

  • js简单倒计时实现代码

    以下是关于“JS简单倒计时实现代码”的完整攻略。 什么是倒计时 倒计时,是指从一个时间点开始,倒数到另一个时间点。在网页设计中,倒计时常被用于展现限时优惠、活动剩余时间等。 实现倒计时的方法 方法一:使用 setInterval 函数 setInterval 函数可以每隔一定时间间隔执行一次指定的函数。因此,在实现倒计时时,我们可以通过 setInterva…

    JavaScript 2023年5月28日
    00
  • jQuery 动画与停止动画效果实例详解

    jQuery 动画与停止动画效果实例详解 本次攻略将会重点讲解jQuery中动画效果的运用与实现,同时还会包括如何停止动画效果。 jQuery 动画的基本使用方法 我们知道,jQuery提供了许多丰富的动画方法,如animate()、fadeIn()、fadeOut()、slideDown()、slideUp()等等,这里我们以animate()为例进行详细…

    JavaScript 2023年6月10日
    00
  • JavaScript中windows.open()、windows.close()方法详解

    JavaScript中window.open()、window.close()方法详解 简介 window.open() 和 window.close() 是 JavaScript 常用方法之一,可以用于在新窗口打开 URL,或关闭现有窗口。本文将详细讲解使用这两个方法的相关知识。 window.open()方法 定义 window.open() 方法被用于…

    JavaScript 2023年6月11日
    00
  • 一个js随机颜色脚本(用于标签页面,也可用于任何页面)

    让我来详细讲解一下如何编写一个JS随机颜色脚本来为标签页面或者其他页面随机生成颜色。 1. 定义一个随机颜色的函数 第一步,我们需要定义一个JS函数来随机生成颜色。代码如下: function getRandomColor() { var letters = ‘0123456789ABCDEF’; var color = ‘#’; for (var i = …

    JavaScript 2023年6月11日
    00
  • 学习LayUI时自研的表单参数校验框架案例分析

    下面是“学习LayUI时自研的表单参数校验框架案例分析”的完整攻略: 学习LayUI时自研的表单参数校验框架案例分析 前言 LayUI是一款基于jQuery的UI库,广泛应用于前端开发中。其提供了丰富的组件和插件,方便快捷地构建Web界面。在使用LayUI过程中,表单参数校验是绕不过去的一个步骤,为此我们研发了一套表单校验框架,下面将详细介绍我们的研发过程和…

    JavaScript 2023年6月10日
    00
  • js实现统计字符串中特定字符出现个数的方法

    要实现统计字符串中特定字符出现次数的方法,可以采用循环遍历每个字符,然后用条件判断来判断该字符是否为目标字符,进而计数的方式来实现。 以下是实现该方法的完整攻略: 步骤1:定义一个函数 首先需要创建一个函数来统计字符串中特定字符出现的次数。下面的代码演示了如何定义名为“countChar”的函数,并将一个字符串和目标字符作为参数传递给它。 function …

    JavaScript 2023年5月28日
    00
  • javascript不同类型数据之间的运算的转换方法

    下面是关于 JavaScript 不同类型数据之间的运算的转换方法的攻略: 类型转换 JavaScript 是一种弱类型语言,允许不同类型之间的运算。但是,不同的类型进行运算时会出现意想不到的结果。为了确保正确的运算结果,我们需要将不同类型的数据转换成相同的类型。 JavaScript 提供了三种类型转换方法: 转换为字符串 转换为数值 转换为布尔值 转换为…

    JavaScript 2023年6月11日
    00
  • 7个令人惊讶的JavaScript特性详解

    7个令人惊讶的JavaScript特性详解 介绍 这篇文章将会介绍七个我们可能不知道或很少使用的有趣的JavaScript特性。这些特性可能会帮助你更好地理解JavaScript的本质以及如何更好地使用它。 1. 默认参数 默认参数允许我们在一个函数的参数列表中为某些参数定义默认值。如果没有传递值给这个参数,它将使用默认值。 function sayHell…

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