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

yizhihongxing

概述

在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日

相关文章

  • uniapp改变底部安全区顶部手机信号时间电池栏颜色样式

    要实现uniapp改变底部安全区顶部手机信号时间电池栏颜色样式,我们可以通过修改程序的manifest.json文件来实现。 步骤如下: 1. 创建 uniapp 项目 在命令行中输入以下命令,即可创建一个新的uniapp项目: vue create –preset dcloudio/uni-preset-vue my-project 2. 修改 mani…

    JavaScript 2023年6月11日
    00
  • js删除数组中的元素delete和splice的区别详解

    JS删除数组中的元素delete和splice的区别详解 在JavaScript中,删除数组元素有两种常见的方法:delete和splice。虽然它们都可以删除数组元素,但使用方法和功能上还是有一些差别的。下面我们就来详细讲解一下它们的区别。 delete方法 delete方法用于删除数组元素,实际上是将该元素的值赋为undefined。它的语法如下: de…

    JavaScript 2023年5月27日
    00
  • html5笛卡尔心形曲线的实现

    实现一个笛卡尔心形曲线,可以使用HTML5 canvas绘制,代码实现如下: HTML代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>HTML5笛卡尔心形曲线的实现</title> <…

    JavaScript 2023年5月28日
    00
  • JS判断两个时间大小的示例代码

    JS判断两个时间大小是一个比较常用的功能,常用于比较两个时间先后顺序,以便进行时间排序、时间筛选等操作。下面是我为大家提供的几个示例代码及攻略。 示例一:使用Date对象实现时间比较 首先,我们需要知道JS中的Date对象是一个非常方便的时间操作工具,它可以将日期和时间存储为一个数字值,然后可以方便地进行各种处理和比较。 以下是使用Date对象实现判断两个时…

    JavaScript 2023年5月27日
    00
  • JavaScript.Encode手动解码技巧

    以下是我准备的“JavaScript.Encode手动解码技巧”的攻略: JavaScript.Encode手动解码技巧 什么是JavaScript.Encode 在 Web 开发中,JavaScript 是一种常用的脚本语言,可以用来实现各种交互效果。JavaScript.Encode 是一种将 JavaScript 代码进行编码的方式,使得代码难以被人识…

    JavaScript 2023年5月19日
    00
  • JavaScript实现点击图片换背景

    对于实现点击图片换背景的功能,我们可以通过以下步骤完成: 在HTML中添加需要更换背景的元素和切换背景用的按钮。 <body> <div id="content"> <h1>点击图片换背景</h1> <p>这是一个示例</p> <img id="bg-…

    JavaScript 2023年6月11日
    00
  • Jquery方式获取iframe页面中的 Dom元素

    获取 IFRAME 页面中的 DOM 元素,可以通过两种方式实现:直接获取子页面中的元素对象或通过 iframe 的 contentWindow 属性获取子页面的 window 对象,从而操作其中的 DOM 元素。以下是使用 jQuery 的方式获取 IFRAME 页面中 DOM 元素的攻略。 使用 jQuery 的方式获取 IFRAME 页面中的 DOM …

    JavaScript 2023年6月10日
    00
  • JavaScript弹出对话框的三种方式

    当我们想向用户展示一些提示信息时,经常会使用JavaScript弹出对话框。JavaScript弹出对话框有三种方式,分别为alert()、confirm()和prompt()。 alert() 使用alert()方法弹出对话框可以显示警告信息,警告信息通常只需要用户确认即可。下面是alert()的语法: alert("警告信息"); 下…

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