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

yizhihongxing

浅谈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分页展示效果”的完整攻略。 前言 在实际项目开发中,通常都需要使用分页功能。常用的分页库有jQuery的pagination.js,但如果不想依赖jQuery,则可以使用原生JS实现分页。本篇文章将介绍如何使用原生JS实现分页展示效果。 实现步骤 第一步:创建分页HTML结构 首先,需要创建一个包含分页按钮的HTML结构。例如: <di…

    JavaScript 2023年6月11日
    00
  • 你不一定知道的关于JavaScript的正则表达式

    你不一定知道的关于JavaScript的正则表达式 在JavaScript中,正则表达式(Regular Expression)是处理字符串的一个强大的工具,我们可以通过正则表达式来匹配、查找、替换字符串。但是,你可能不知道JavaScript中正则表达式的许多细节和技巧,下面我们来一一介绍。 正则表达式基本语法 正则表达式是由字符和操作符组成的,比如: /…

    JavaScript 2023年5月28日
    00
  • Ajax和$.ajax使用实例详解(推荐)

    关于“Ajax和$.ajax使用实例详解(推荐)”的完整攻略,我可以给你一些详细的讲解。 Ajax和$.ajax的概述 Ajax(Asynchronous JavaScript and XML,异步JavaScript和XML)是一种用于创建交互式和动态网页的技术,它通过在后台与服务器进行少量的数据交换,实现页面的局部更新和动态加载等功能。而$.ajax()…

    JavaScript 2023年6月11日
    00
  • BootstrapValidator验证用户名已存在(ajax)

    让我来为你详细讲解“BootstrapValidator验证用户名已存在(ajax)”的完整攻略。 标题 首先,我们需要给这个攻略起个标题。根据内容,可以考虑起名为“BootstrapValidator验证用户名已存在(ajax)”。 说明 为了实现这个功能,我们需要用到以下内容: BootstrapValidator插件 Ajax请求来检查用户名是否已存在…

    JavaScript 2023年6月10日
    00
  • 12个提高JavaScript技能的概念(小结)

    下面我将详细讲解“12个提高JavaScript技能的概念(小结)”的完整攻略。 1. 箭头函数 箭头函数是 ES6 中的新语法,它可以让我们更方便、简洁地创建函数,而且还有一些特殊的作用域规则。箭头函数的语法示例如下: const sum = (a, b) => a + b; 在上面的示例中,我们定义了一个名为 sum 的箭头函数,它接受两个参数 a…

    JavaScript 2023年5月18日
    00
  • JS中内存泄漏的几种情况

    JavaScript 中的内存泄漏是指程序中使用的内存不再被需要却没有被释放,最终导致浏览器或者 Node.js 进程使用的内存越来越大,直到程序崩溃或者系统运行缓慢。 在 JavaScript 中,内存泄漏通常是由于变量、对象、闭包、事件监听器等长期存在而没有被释放引起的。这些长期存在的引用会阻止垃圾回收器回收内存,最终导致内存泄漏。     内存泄漏通常…

    JavaScript 2023年5月9日
    00
  • js实现无刷新监听URL的变化示例代码详解

    首先,我们需要明确什么是URL的变化。以单页面应用(SPA)为例,当用户在页面内部进行操作时,可能会通过JavaScript动态更新URL的参数或片段,实现页面内容的变化。但是,这种变化不会像页面刷新那样引起整个页面的重新加载。 如果我们想要对URL的变化进行监听,有两种方法可以选择。 方法一:使用window.onhashchange事件 在HTML5规范…

    JavaScript 2023年6月11日
    00
  • Javascript中Eval函数的使用

    当我们需要将某个字符串当做JavaScript代码来执行时,Eval函数就可以派上用场了。Eval函数的学习对于理解和书写高级JavaScript代码具有一定的帮助。 什么是 Eval 函数 Eval函数是JavaScript内置的一个全局函数,可以将指定的字符串解析为JavaScript代码并执行。通常我们会把一段需要执行的JavaScript代码以字符串…

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