JavaScript 微任务和宏任务讲解

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日

相关文章

  • JavaScript类和继承 constructor属性

    JavaScript类和继承是面向对象编程的主要概念之一。构造函数是类的重要组成部分之一,通过构造函数我们可以创建新的实例,同时constructor属性则是描述类的属性之一。以下是完整攻略: 一、JS类的创建 JS 类的创建可以使用ES5和ES6进行定义。 在ES5 中,使用构造函数和原型算法来定义类,而在ES6 中,使用class和constructor…

    JavaScript 2023年5月27日
    00
  • 8个工程必备的JavaScript代码片段

    下面是“8个工程必备的JavaScript代码片段”的完整攻略: 简介 这篇攻略主要介绍8个在前端工程中经常使用的JavaScript代码片段,这些代码片段能够提高你的代码质量和工作效率,让你的代码更加可读、可维护。 文章目录 forEach循环遍历数组 Object.keys()获取对象的属性名数组 数组去重 获取URL参数值 判断一个对象是否为空 判断两…

    JavaScript 2023年5月27日
    00
  • 微信小程序 教程之小程序配置

    微信小程序教程之小程序配置 小程序配置是开发微信小程序的第一步。本文将为大家讲解小程序配置的详细流程。 1. 注册小程序账号 在开发微信小程序之前,需要先注册小程序账号。注册小程序账号的具体流程可以参考官方文档。 2. 创建小程序应用 注册完成小程序账号后,需要登录小程序平台,然后点击“创建小程序”按钮,进入小程序创建页面。在此页面填写小程序的基本信息,包括…

    JavaScript 2023年6月11日
    00
  • 动态加载JavaScript文件的两种方法

    当我们开发网站时,通常需要使用JavaScript来实现一些交互式效果,但是如果我们在HTML中直接将JavaScript代码写在页面中的话,会造成页面加载速度变慢,如果JavaScript代码很大的话,可能会严重影响用户体验。那么,如何能够提高网站的加载速度呢?答案是:动态加载JavaScript。 动态加载JavaScript的优势有: 减少页面的加载时…

    JavaScript 2023年5月27日
    00
  • Element中Select选择器的实现

    Element是一个基于Vue.js的组件库,提供了众多实用的UI组件。其中,Select选择器是一种常用的表单组件,用于从预定义的选项列表中选择一个或多个值。下面是Element中Select选择器的实现攻略。 1. 基本用法 使用Element中的Select选择器,需要先引入Select组件。 <template> <div> …

    JavaScript 2023年6月10日
    00
  • javascript中replace使用方法总结

    JavaScript中replace使用方法总结 replace()方法是JavaScript中字符串对象的一个常用方法,其作用是在字符串中搜索指定的子字符串或者正则表达式,并将其替换为新的子字符串。在本篇文章中,我们将对replace()方法进行详细的讲解和总结。 基本使用 replace()方法的基本语法如下: string.replace(search…

    JavaScript 2023年5月28日
    00
  • Javascript中暂停功能的实现代码

    要实现Javascript中的暂停功能,可以采用以下几种方法: 方法一:使用setTimeout 使用setTimeout函数可以实现暂停功能,具体实现方式如下: function sleep(milliseconds) { return new Promise(resolve => setTimeout(resolve, milliseconds))…

    JavaScript 2023年6月10日
    00
  • fmt:formatDate的输出格式详解

    让我为您解释“fmt:formatDate的输出格式详解”。 首先,我们需要了解“fmt:formatDate”是一个JSTL中用来将日期格式化输出的标签。在使用此标签时,需要设置格式化规则,我们可以通过写出特定的格式选项,从而实现不同的日期格式输出。下面进入具体步骤。 1. 设置日期值 使用fmt:formatDate标签时,需要提供一个日期,可以是Dat…

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