JavaScript 微任务和宏任务讲解

yizhihongxing

JavaScript 微任务和宏任务讲解

在 JavaScript 中,异步任务主要分为微任务和宏任务两种。宏任务可以理解为宏大的任务,就是需要花费比较长时间才能完成的任务,比如定时器、ajax 请求、DOM 事件等。微任务可以理解为小任务,比较轻量,基本上可以在当前任务完成后马上被执行,比如 Promise。

在执行异步任务时,引擎会将宏任务放入宏任务队列中,并在执行完当前任务后优先处理宏任务队列中的任务。而当一个宏任务执行完之后,它所携带的微任务会被全部执行完后才会继续执行下一个宏任务。

下面通过两条示例来说明:

示例一

console.log('start');

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

new Promise(function(resolve) {
  console.log('promise');
  resolve();
}).then(function() {
  console.log('then');
});

console.log('end');

在上面这个例子中,先输出 start,然后创建了一个 Promise 对象并打印了 promise,接着运行到 .then() 时,会将回调函数 function() { console.log('then'); } 添加到微任务队列中,此时输出 end,然后宏任务队列中只有一个定时器任务,输出 setTimeout

所以最终的输出结果为:

start
promise
end
then
setTimeout

示例二

console.log('start');

setTimeout(function() {
  console.log('setTimeout1');
  Promise.resolve().then(function() {
    console.log('then1');
  });
}, 0);

setTimeout(function() {
  console.log('setTimeout2');
  Promise.resolve().then(function() {
    console.log('then2');
  });
}, 0);

console.log('end');

在上面这个例子中,首先输出 start,然后创建了两个定时器任务,并分别添加了两个微任务 then1then2,最后输出 end

所以最终的输出结果为:

start
end
setTimeout1
then1
setTimeout2
then2

需要注意的是,在某些特定场景下,微任务和宏任务的执行顺序可能存在一些不同。比如在节点监听器中,MutationObserver 监听到 DOM 变化后,会先执行微任务再执行宏任务。

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

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • js导入导出excel(实例代码)

    下面是关于 JavaScript 导入导出 Excel 的详细攻略,主要包括以下几个方面的内容: Excel 文件格式 导出 Excel 导入 Excel 示例代码 1. Excel 文件格式 在导出 Excel 之前,我们需要了解 Excel 文件格式与其它文本文件的不同之处。Excel 文件主要分为两种格式:xls 和 xlsx。其中,xls 是二进制格…

    JavaScript 2023年5月27日
    00
  • JSON Schema概念及使用场景

    JSON Schema概念及使用场景 什么是JSON Schema JSON Schema是一种用于描述JSON数据格式的规范。它可以定义JSON格式的结构、各个字段的类型和取值范围等限制条件。 JSON Schema通常以JSON对象的形式给出,其中包含了对目标数据的描述信息。JSON Schema使用的是标准的JSON规则,可以由任何支持JSON的软件系…

    JavaScript 2023年5月27日
    00
  • html页面显示年月日时分秒和星期几的两种方式

    让我们来探讨一下如何在HTML页面中显示当前的年月日、时分秒和星期几的两种方式。 方式一:使用JavaScript实现 实现步骤: 在HTML页面中添加一个显示日期时间的标签,例如这里我们使用<p>标签作为容器,<p id=”datetime”></p>: <p id="datetime">…

    JavaScript 2023年5月27日
    00
  • js内存泄漏场景、如何监控及分析详解

    JS内存泄漏场景、如何监控及分析详解 什么是JS内存泄漏? JS内存泄漏是指在代码中,一些不再需要的对象仍然存在于内存中,却没有被正确地释放,最终导致内存不足、程序崩溃等问题。常见的内存泄漏场景有如下几个: 全局变量:在全局环境中定义的变量、函数、对象等,没有被垃圾回收机制清除,会一直存在于内存中。 定时器:使用setInterval和setTimeout定…

    JavaScript 2023年6月10日
    00
  • JS轻量级函数式编程实现XDM一

    JS轻量级函数式编程实现XDM一 本文介绍如何使用JS轻量级函数式编程实现XDM一。 什么是XDM一 XDM一是一个JavaScript库,用于浏览器端和Node.js环境中的跨域通信。它提供了一种简单的API,使得跨域通信变得容易。 函数式编程实现XDM一 我们的目标是使用函数式编程来实现XDM一。 函数式编程是一种编程范式,它强调使用函数来解决问题。函数…

    JavaScript 2023年5月28日
    00
  • 5款Ajax 文件上传控件

    Ajax文件上传控件是很常见的一些Web技术之一,它可以使得网页用户在不刷新页面的情况下上传文件,并且可以在上传的过程中实时显示上传进度。这里我们介绍5款常见的Ajax文件上传控件。 1. AjaxUpload AjaxUpload是一种轻量级文件上传控件,代码很少,使用也非常简单,只需要用一个额外的JS文件即可。下面是一个简单的演示: new AjaxUp…

    JavaScript 2023年6月11日
    00
  • 自制的文件上传JS控件可支持IE、chrome、firefox etc

    实现自制的文件上传JS控件,需要分为以下几个步骤: 第一步:定义HTML结构 首先,我们需要定义HTML结构,提供上传文件的按钮,显示上传进度的进度条以及文件选择框的位置。 <div id="upload-box"> <input type="file" name="file" i…

    JavaScript 2023年5月27日
    00
  • 详解JS异步加载的三种方式

    详解JS异步加载的三种方式 JS异步加载指的是JavaScript代码在浏览器中执行时,通过非阻塞IO的方式,使得代码的执行不会阻塞页面的渲染和交互,从而提升用户体验。而JS异步加载的方式主要有以下三种: 1. defer 使用 defer 属性可以将脚本的加载推迟到文档的解析和显示完成之后再执行。这个过程会是解析 HTML 文档和执行 JS 脚本并行进行的…

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