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操作XML/HTML比较常用的对象属性集锦

    当我们在 JavaScript 中操作 XML 或 HTML 时,需要使用一些特定的对象和属性。下面是一些常用的对象属性的详细说明: 1. DOM:文档对象模型 DOM 是将 HTML 或 XML 文档表示为树结构,使用 DOM 可以很容易地访问和操作文档的某个部分。DOM 中最常用的属性包括: document:代表整个文档。 getElementById…

    JavaScript 2023年6月10日
    00
  • JavaScript严格模式详解

    JavaScript严格模式详解 什么是JavaScript严格模式? JavaScript严格模式(Strict Mode),是一种更加安全和严谨的JavaScript编程模式。它主要的目的是消除Javascript语法的一些不合理、不严谨之处,减少与JavaScript引擎的冲突,并且对JavaScript中的一些不安全操作进行了限制。 当我们在开发中将…

    JavaScript 2023年6月10日
    00
  • Javascript中判断一个值是否为undefined的方法详解

    当我们使用JavaScript编写代码时,通常需要对变量或函数返回值是否为“未定义(undefined)”进行判断,JavaScript中判断一个值是否为undefined的方法有很多种,下面我们就逐个进行说明。 1.使用typeof typeof是用来检测变量类型的操作符,如果变量未定义,则返回”undefined”,因此可以用typeof来判断一个值是否…

    JavaScript 2023年5月28日
    00
  • 微信小程序 触控事件详细介绍

    微信小程序 触控事件详细介绍 在微信小程序开发中,触控事件是非常重要的一部分,掌握触控事件可以让我们更好地掌控页面的交互体验。接下来,我们将详细介绍微信小程序中常用的触控事件。 原生触控事件 微信小程序中,原生支持的触控事件有: touchstart 当手指触摸屏幕并开始移动时触发,即手指触摸屏幕的瞬间会触发一次。可以通过 event.touches 事件对…

    JavaScript 2023年6月11日
    00
  • 数组方法解决JS字符串连接性能问题有争议

    JS中字符串的连接操作会对性能产生较大的影响,特别是在大批量数据拼接时。为了解决这一问题,人们常常使用数组来临时存储数据,然后再一次性地对它们进行连接。这里整理了一些数组方法来解决JS字符串连接性能问题,同时也探讨了其中的争议点。 1. 为什么使用数组可以提升字符串连接的性能? 在JS中,字符串是不可变的,一旦创建就无法修改。因此,每次对字符串进行拼接都会创…

    JavaScript 2023年5月27日
    00
  • 简单实现js上传文件功能

    实现js上传文件功能主要分为以下几个步骤: 1. 创建HTML文件上传表单 创建一个表单,用于接收用户上传的文件。表单中需要包含一个<input type=”file”>的输入框,用于选择文件。同时也可以添加一些其它的表单元素,如文本框和按钮等,方便用户填写一些附加信息。 <form method="post" enct…

    JavaScript 2023年5月27日
    00
  • pdf2swf+flexpapers实现类似百度文库pdf在线阅读

    PDF2SWF是一个将PDF文件转换为SWF文件的开源工具,FlexPaper 是一个基于 Flash 的开源文档阅读器。联合使用这两个工具可以用来实现类似百度文库 PDF 在线阅读的效果。 下面是实现该过程的完整攻略: 步骤1:安装和配置软件 安装 PDF2SWF。PDF2SWF 可以从http://www.swftools.org/download.ht…

    JavaScript 2023年6月11日
    00
  • JavaScript实现动态网页飘落的雪花

    一、前言 在网页设计中,为了增加节日气氛或者美化页面,经常会配上一些漂亮的特效。其中,飘雪效果是比较常见的一个效果。本篇文章主要介绍JavaScript实现动态网页飘落的雪花的详细攻略。 二、基本思路 主要思路是使用setInterval()函数对页面中的每一个雪花进行计算、控制其位置以及更新其状态,并使用CSS和HTML控制每个雪花的样式以及雪花的总数。 …

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