深入理解JavaScript中的宏任务和微任务机制

概述

在JavaScript中,任务的执行分为两种:宏任务和微任务。宏任务和微任务是异步任务的一种处理方式,可以帮助我们合理地安排任务的执行顺序,避免出现项目中遇到的异步问题。

宏任务

宏任务是由浏览器内置的任务处理机制进行处理的,包括:加载事件(如load)、鼠标事件、输入事件、定时器事件等。当浏览器执行完当前宏任务后,才会去检查是否有待处理的微任务,如果有,就把所有的微任务全部执行。

微任务

微任务相对于宏任务而言,处理方式更加灵活,它们通过Promise进行管理。当Promise的状态变为resolved或rejected时,就会触发微任务。在当前任务执行结束后,会立即执行所有微任务,而不需要等待下一个宏任务执行。

如果在执行微任务时,又产生了新的微任务,会继续将其加入到微任务队列中,直到队列被清空。

示例说明

示例1

console.log("start");

setTimeout(function() {
  console.log("setTimeout");
}, 0);

Promise.resolve().then(function() {
  console.log("promise1");
}).then(function() {
  console.log("promise2");
});

console.log("end");

由于setTimeout是宏任务,Promise.resolve().then是微任务,程序的执行顺序如下:

start
end
promise1
promise2
setTimeout

示例2

console.log("start");

setTimeout(function() {
  console.log("setTimeout");
}, 0);

Promise.resolve().then(function() {
  console.log("promise1");

  Promise.resolve().then(function() {
    console.log("promise1.1");
  }).then(function() {
    console.log("promise1.2");
  });
}).then(function() {
  console.log("promise2");
});

console.log("end");

同样,setTimeout是宏任务,Promise.resolve().then是微任务,由此产生的嵌套Promise同样是微任务。程序执行顺序如下:

start
end
promise1
promise1.1
promise1.2
promise2
setTimeout

从上述两个示例可以看出,微任务的执行顺序是在同一个宏任务中先执行所有微任务,再执行宏任务。在宏任务执行时,如果产生了新的微任务,则会加入到微任务队列中,等待下一次宏任务执行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解JavaScript中的宏任务和微任务机制 - Python技术站

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

相关文章

  • JavaScript前端实用的工具函数封装

    一、目标本篇攻略旨在帮助Javascript前端开发者快速了解常用的工具函数的封装,并学会自行编写及封装工具函数。 二、介绍工具函数封装指的是将常用的功能代码封装成一个个可复用的函数,以便于代码重用、整合和维护。虽然功能代码可能并不复杂,但通过工具函数的封装,可以减少代码冗余,提高代码的可读性、可扩展性和可维护性。参考以上目标,我们可以将工具函数的封装分为以…

    JavaScript 2023年6月11日
    00
  • 使用JSLint提高JS代码质量方法分享

    下面我将为你讲解如何使用JSLint来提高JS代码质量的完整攻略。 什么是 JSLint? JSLint 是一个自动检测 JavaScript 代码风格和错误的工具,它可以帮助您编写更加规范和健壮的 JavaScript 代码。 如何使用 JSLint 检测 JavaScript 代码? 你可以使用以下两种方法使用 JSLint 检测 JavaScript …

    JavaScript 2023年5月19日
    00
  • 获取dom元素那些讨厌的位置封装代码

    获取DOM元素位置是Web开发中比较常见的操作,但是由于不同浏览器之间存在差异,所以封装获取DOM元素位置代码时需要注意一些细节。在以下步骤中,我们将展示如何获取DOM元素的位置并将其封装到一个函数中。 1. 获取元素位置 文档坐标(client coordinate):指相对于左上角(0, 0)位置的像素坐标,通过DOM节点的clientX和clientY…

    JavaScript 2023年6月10日
    00
  • 深入探密Javascript数组方法

    深入探密Javascript数组方法 前言 Javascript中的数组是一组有序且可变的值的集合。数组为我们提供了一组非常简便、高效的API来处理集合的数据,比如增加、删除、查找等操作。在本篇文章中,我们将深入探讨Javascript数组的方法。 1.数组的创建 1.1 常用数组的创建方式 数组可以通过以下方式创建: 1.使用数组字面量创建数组。 let …

    JavaScript 2023年5月18日
    00
  • JavaScript中数组slice和splice的对比小结

    下面是JavaScript中数组slice和splice的对比小结的详细攻略: 简介 在JavaScript中,数组是一种常见的数据结构。在对数组进行处理时,有时候我们需要对数组进行裁剪或修改等操作。其中,slice和splice是两个常用的方法,因此本文将对这两个方法进行详细的讲解和对比。 slice方法 slice方法可以从一个已有的数组中返回选定的元素…

    JavaScript 2023年5月27日
    00
  • JS加载解析Markdown文档过程详解

    以下是详细的攻略,在此过程中,假设使用的是原生JS,没有使用任何外部库: 1. 获取Markdown文档内容 要加载Markdown文档,我们首先需要获取文件内容。可以使用XMLHttpRequest对象进行同步或异步的文件读取。这里我们以异步的方式读取Markdown文件。 function loadMarkdownFile(url, callback) …

    JavaScript 2023年5月27日
    00
  • event.X和event.clientX的区别分析

    那么让我们来详细分析一下“event.X和event.clientX的区别”。 1. 事件对象(event)简介 在JavaScript中,与事件相关的数据都被封装在一个事件对象中,该对象用来携带事件发生时的一些信息,比如事件类型、目标元素、鼠标坐标、键盘按键等。 2. event.X和event.clientX的区别 event.X表示鼠标相对于当前元素的…

    JavaScript 2023年6月11日
    00
  • 解决JS表单验证只有第一个IF起作用的问题

    解决JS表单验证只有第一个IF起作用的问题 问题描述:在进行表单验证时经常遇到的一个问题是只有第一个IF语句能够起作用,导致多个验证条件无法生效。这个问题的根本原因是没有逐步排查错误,或者是代码逻辑不清晰。接下来我们将分步骤解决这个问题。 步骤一:优化代码结构 当我们的代码中有多个条件需要验证时,可能会将它们全部写在同一个IF语句块中,这样容易出现只有第一个…

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