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

yizhihongxing

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自动生成 年月范围 选择功能完整示例【基于jQuery插件】

    下面是详细的攻略: 一、概述 该功能主要实现了自动生成年月范围选择,方便用户从一个日期范围中选择具体的日期。 本文将通过使用jQuery插件的方式进行实现,具体实现过程会涉及到如下内容: HTML5中的input元素; CSS样式的设置; jQuery插件的编写。 二、HTML代码 本功能主要实现由两个input输入框组成的日期选择器,其中一个为开始日期的选…

    JavaScript 2023年5月27日
    00
  • 浅析JavaScript中的类型和对象

    浅析JavaScript中的类型和对象 JavaScript数据类型 JavaScript中有多种数据类型,包括: 基本类型: Number:数值类型,如1、2、3等。 String:字符串类型,如”hello world”等。 Boolean:布尔类型,包括true和false。 Null:表示空值。 Undefined:表示未定义。 引用类型: Obje…

    JavaScript 2023年5月27日
    00
  • cookie的secure属性详解

    Cookie的secure属性详解 什么是Cookie? Cookie是一种由Web服务器存储在Web浏览器上的小文本文件。当Web浏览器向同一服务器发出请求时,会将Cookie发送回服务器。在服务器处理请求时,Cookie提供了一种追踪用户的机制,以便在多个页面或跨站点之间保持状态信息。因此,Cookie是Web应用程序的重要组成部分。 Cookie的Se…

    JavaScript 2023年6月11日
    00
  • javascript绘制漂亮的心型线效果完整实例

    下面是详细讲解“javascript绘制漂亮的心型线效果完整实例”的完整攻略。 1. 前期准备 在绘制心型线前,我们需要有基本的html文件和css样式文件。html文件中需要添加一个canvas标签,而css样式设置canvas标签为画布,并赋予宽度和高度。代码如下: <!DOCTYPE html> <html lang="en…

    JavaScript 2023年6月10日
    00
  • Script的加载方法小结

    那么让我来详细讲解Script的加载方法小结。 Script的加载方法小结 直接加载Script文件 可以使用script标签来直接加载一个外部的JavaScript文件。 <script src="path/to/script.js"></script> 这种方式最简单,也是最常见的加载方式。但它也有一些缺点,比…

    JavaScript 2023年5月27日
    00
  • 引入JavaScript时alert弹出框显示中文乱码问题

    引入JavaScript时alert弹出框显示中文乱码问题的攻略如下: 确认HTML页面编码 在HTML页面的标签中,使用来指定页面编码为UTF-8,例如: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>M…

    JavaScript 2023年5月19日
    00
  • 用VsCode编辑TypeScript的实现方法

    下面是用VsCode编辑TypeScript的详细攻略: 安装VsCode 首先,需要到VsCode官网下载并安装VsCode。可以根据自己的操作系统选择相应的版本。 安装TypeScript插件 安装好VsCode后,需要在插件商店里搜索并安装TypeScript插件。TypeScript插件可以给VsCode提供对于TypeScript的智能提示、语法错…

    JavaScript 2023年6月11日
    00
  • asp javascript 实现关闭窗口时保存数据的办法

    下面是“asp javascript 实现关闭窗口时保存数据的办法”的完整攻略: 1. 使用 onbeforeunload 事件 onbeforeunload 事件可以在页面关闭之前触发,我们可以在这个事件中实现数据保存的逻辑。具体实现步骤如下: 在页面中添加 <body onbeforeunload=”return onBeforeUnloadHan…

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