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日

相关文章

  • js 调用本地exe的例子(支持IE内核的浏览器)

    下面将详细讲解“JS 调用本地 EXE 的例子(支持 IE 内核的浏览器)”的完整攻略,并提供两条示例。 准备工作 在进行本地 EXE 执行前,需要进行以下准备工作: 在服务器上放置本地 EXE 程序。 使用本地服务器,将前端代码放置于本地服务器上,这样才能执行本地 EXE 程序。 使用 IE 内核的浏览器,否则无法执行本地 EXE 程序。 JS 调用本地 …

    JavaScript 2023年5月27日
    00
  • JavaScript正则表达式校验与递归函数实际应用实例解析

    下面是详细讲解JavaScript正则表达式校验与递归函数实际应用实例解析的完整攻略。 一、正则表达式校验 1.1 什么是正则表达式 正则表达式是一种用特定语法编写的用来匹配、搜索和替换字符串的工具。在JavaScript中,可以使用正则表达式来校验和处理字符串。 1.2 常用的正则表达式语法 下面是一些常用的正则表达式语法: ^ 匹配字符串的开始位置 $ …

    JavaScript 2023年5月28日
    00
  • 详细聊聊JavaScript是如何影响DOM树构建的

    JavaScript 是一门动态、基于事件驱动的脚本语言,被广泛应用于网页交互验证、动态效果实现等方面。同时,JavaScript 也有着非常重要的作用,就是影响 DOM 树的构建。 DOM(文档对象模型)是指文档的对象表示法,是一种用于表示 XML 或 HTML 文档的内部结构树,它由节点(节点是指文档中至少有一个位置的名称)和对象组成,节点包括元素节点、…

    JavaScript 2023年6月10日
    00
  • JS实现多物体运动的方法详解

    JS实现多物体运动的方法详解 在Web开发中,常常需要实现多个物体同时进行运动的效果,这时我们可以使用JavaScript来控制多个DOM元素的运动。本文将详细讲解JS实现多物体运动的方法。 步骤一:获取多个DOM元素的初始状态 在程序开始运行之前,我们需要获取多个DOM元素的初始状态,这些状态包括元素的初始位置、大小、颜色等信息。在JavaScript中可…

    JavaScript 2023年6月11日
    00
  • Js+Ajax,Get和Post在使用上的区别小结

    当我们使用 JavaScript 和 Ajax 发送请求到服务器时,我们通常会使用 GET 和 POST 方法。虽然它们都用于发送 HTTP 请求,但它们在实现和用法上是不同的。以下是它们之间的区别: GET 方法 GET 方法是一种在查询字符串中传递参数的 HTTP 请求方法,它通过 URL 发送数据到服务器。这意味着通过 GET 发送的请求,请求的数据可…

    JavaScript 2023年6月11日
    00
  • js之WEB开发调试利器:Firebug 下载

    Firebug 是一个非常优秀的 JavaScript 调试工具,它可以帮助开发人员定位代码问题,提高开发效率。以下是下载Firebug的步骤: 步骤一:访问Firebug官网 首先访问Firebug官网:https://getfirebug.com 步骤二:下载Firebug插件 在Firebug官网上,点击“Download Firebug”按钮。根据自…

    JavaScript 2023年6月11日
    00
  • JavaScript数组合并的多种方法

    下面是“JavaScript数组合并的多种方法”的完整攻略。 方法一:concat() concat() 方法将两个或多个数组合并成一个新数组。 使用示例 const arr1 = [1, 2, 3]; const arr2 = [4, 5, 6]; const arr3 = arr1.concat(arr2); console.log(arr3); // …

    JavaScript 2023年5月27日
    00
  • JS中处理与当前时间间隔的函数代码

    JS中处理与当前时间间隔的函数代码通常包含两个部分:获取当前时间和计算时间间隔。以下是完整攻略: 获取当前时间 JavaScript中可以使用Date对象获取当前时间。可以使用以下两种方式创建一个Date对象: // 创建一个包含当前时间的日期对象 var currentTime = new Date(); // 创建一个包含指定时间的日期对象 var sp…

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