JavaScript事件循环及宏任务微任务原理解析

JavaScript事件循环及宏任务微任务原理解析

在学习 JavaScript 过程中,事件循环机制是必须要掌握的知识点之一。本文将详细介绍 JavaScript 事件循环机制的原理,以及宏任务和微任务的概念及异同点,其中包含两个示例说明。

事件循环机制的原理

JavaScript 是单线程执行的,意味着同一时间只能执行一段代码。然而在 Web 世界中,我们需要处理大量的事件,比如鼠标点击、异步请求等。如果执行这些事件的时候还需要等待之前的事件执行完毕,那会导致页面卡顿,影响用户体验。因此我们需要一种机制来异步处理这些事件,这就是事件循环机制。

事件循环机制的原理就是不断地从事件队列中取出事件并执行,当队列为空时,就等待新的事件进入队列。事件的触发可以是用户交互、定时器、网络请求等。事件的回调函数会被分配到不同的队列中,分别是宏任务队列和微任务队列。

宏任务和微任务的概念及异同点

宏任务

宏任务就是当前 JavaScript 任务队列中的任务,同一时间只有一个宏任务在执行。在浏览器中,宏任务包括:页面渲染、用户交互事件、定时器等。

微任务

微任务是宏任务中的一段异步代码,和宏任务不同的是,同一时间可以有多个微任务在执行。在浏览器中,微任务包括:Promise、MutationObserver。

异同点

宏任务和微任务最大的区别在于执行时机的不同。

  • 执行宏任务时会先执行同步任务,然后开始执行异步任务;
  • 执行微任务时会等待同步任务和异步任务都执行完毕之后,再按照执行顺序执行所有的微任务。

示例说明

示例一

console.log('script start');

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

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

console.log('script end');

以上代码执行结果为:

script start
script end
promise1
promise2
setTimeout

解释:

  1. console.log('script start'); 为同步任务,输出 "script start"
  2. setTimeout 为异步任务,被分配到宏任务队列中,等待同步任务执行完毕后执行;
  3. Promise 为异步任务,被分配到微任务队列中。由于在执行完同步任务后,先执行微任务队列中的所有任务,因此先输出 "promise1",再输出 "promise2"
  4. 最后执行宏任务队列中的任务,输出 "setTimeout"

示例二

console.log('1');

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

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

console.log('5');

以上代码执行结果为:

1
5
3
2
4

解释:

  1. console.log('1'); 为同步任务,输出 "1"
  2. setTimeout 为异步任务,被分配到宏任务队列中,等待同步任务执行完毕后执行;
  3. Promise 为异步任务,先输出 "3",然后继续执行微任务队列中的任务;
  4. setTimeout 为异步任务,被分配到宏任务队列中,等待微任务队列中的任务执行完毕后执行;
  5. 最后执行宏任务队列中的任务,输出 "2""4"

以上就是 JavaScript 事件循环机制的原理和宏任务微任务的概念及异同点的详细说明,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript事件循环及宏任务微任务原理解析 - Python技术站

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

相关文章

  • javascript实现日期按月份加减

    下面是详细的讲解“javascript实现日期按月份加减”的完整攻略。 一、需求分析 在实现日期按月份加减之前,我们首先需要理清楚需求,明确具体的要求和目标: 输入一个日期和月份增减的数字,输出增减后的日期 增减的数字可以是正数(表示加),也可以是负数(表示减) 如果增减后的日期超出了月份的天数限制,则应该自动调整至该月最后一天 输入的日期格式可以是常用的 …

    JavaScript 2023年5月27日
    00
  • 使用 JScript 创建 .exe 或 .dll 文件的方法

    以下是使用 JScript 创建 .exe 或 .dll 文件的方法的完整攻略。 方案1:使用 JScript.NET 创建 .dll 文件 步骤1:打开 Visual Studio 并创建新项目 打开 Visual Studio。在菜单栏上选择“文件” -> “新建” -> “项目”。 在“新建项目”对话框中,选择“Visual J#” -&g…

    JavaScript 2023年5月27日
    00
  • JavaScript String 对象常用方法详解

    下面我来详细讲解一下 JavaScript String 对象常用方法。 一、JavaScript String 对象简介 JavaScript 中的 String 对象,用于处理文本(字符串)数据。它包含了许多实用的方法,可以完成字符串的拼接、截取、检索、替换等操作。 二、JavaScript String 对象常用方法详解 下面是 JavaScript …

    JavaScript 2023年5月27日
    00
  • JavaScript将相对地址转换为绝对地址示例代码

    下面是关于JavaScript将相对地址转换为绝对地址的攻略,包含以下四个步骤: 获取当前页面的URL和相对地址。 判断相对地址的类型(同级、下级、上级)。 根据相对地址的类型,将其转换为绝对地址。 使用转换后的绝对地址进行操作。 下面用两个示例来说明具体的实现过程。 示例一:转换同级相对地址为绝对地址 在相同层级的情况下,相对地址一般是以./开头。比如,当…

    JavaScript 2023年6月11日
    00
  • JavaScript中的return语句简单介绍

    JavaScript中的return是一个语句(statement),它表示函数执行完毕后返回一个值,并结束函数的执行。当函数执行到return语句时,函数将会立即停止执行,并将return后面的值返回给函数调用者。同时,如果函数没有返回值,则会返回undefined。 下面示例说明了return的用法: function add(a, b) { retur…

    JavaScript 2023年5月28日
    00
  • javascript中parentNode,childNodes,children的应用详解

    Javascript中parentNode, childNodes, children的应用详解 在Javascript中,parentNode, childNodes和children都是DOM Node对象中的属性或方法,用于操作和访问HTML文档中的元素节点。 parentNode parentNode 是通过访问节点的父节点来获取该节点的方法。 在H…

    JavaScript 2023年6月10日
    00
  • 疯掉了,尽然有js写的操作系统

    关于“疯掉了,竟然有JS写的操作系统”,我可以提供以下攻略。 什么是“JS操作系统” “JS操作系统”实际上是基于浏览器的操作系统,使用前端技术进行开发,其核心思想是JavaScript虚拟机和Web浏览器的结合。在这种操作系统中,所有IED编写的HTML、CSS和JavaScript均可作为应用程序运行。 如何搭建“JS操作系统” 1. 安装Node.js…

    JavaScript 2023年5月27日
    00
  • JavaScript中将数组进行合并的基本方法讲解

    JavaScript中将数组进行合并的基本方法有多种, 下面我将详细介绍其中的三种方法。 使用concat()方法 concat()方法是JavaScript中最基本的合并数组的方法。它可以将多个数组连接成一个数组。我们可以在一个数组末尾添加一个或多个数组。这个方法会返回一个新数组,而不会改变原始数组。具体用法如下: let arr1 = ["A&…

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