JS事件循环-微任务-宏任务(原理讲解+面试题分析)

JS事件循环-微任务-宏任务

在JS中,事件循环是一种非常重要的机制。通过事件循环,我们可以更好地实现代码的异步执行。了解JS事件循环的机制,也是在前端开发中非常必要的一项知识。

事件循环机制

事件循环机制是指JS引擎处理JS代码的一种机制。简单来说,JS引擎在执行JS代码时,会按照特定的顺序去处理事件,而这个顺序就是事件循环。与此同时,JS引擎还会把这些事件分成两类:微任务和宏任务。

微任务和宏任务

微任务

微任务是一种比较“轻量级”的事件,它的执行时间一般比较短,并且微任务的执行顺序也比较靠前,即在下一个事件循环执行之前执行。微任务包括以下几种:

  • Promise
  • process.nextTick (Node.js)
  • MutationObserver (浏览器)

宏任务

宏任务是一种比较“重量级”的事件,它的执行时间可能会比较长,并且宏任务的执行顺序也比较靠后,即在下一个事件循环执行之后执行。宏任务包括以下几种:

  • setTimeout
  • setInterval
  • setImmediate (Node.js)
  • requestAnimationFrame (浏览器)
  • I/O (Node.js)

事件循环流程

事件循环的流程大致分为以下几步:

  1. 首先,JS引擎会从宏任务队列中取出一个任务执行,如果宏任务队列为空,则会执行微任务队列中的所有任务。
  2. 接着,JS引擎会处理微任务队列中的所有任务,并且把新产生的微任务加入微任务队列中。
  3. 然后,JS引擎会处理宏任务队列中的下一个任务,如果宏任务队列中还有任务,则重复第1~3步,直到宏任务队列为空为止。

示例

示例一

console.log('start')

setTimeout(() => {
  console.log('timer1')

  Promise.resolve().then(() => {
    console.log('promise1')
  })
}, 0)

setTimeout(() => {
  console.log('timer2')

  Promise.resolve().then(() => {
    console.log('promise2')
  })
}, 0)

Promise.resolve().then(() => {
  console.log('promise3')
})

console.log('end')

输出结果为:

start
end
promise3
timer1
promise1
timer2
promise2

代码执行过程分析:

  1. 执行console.log('start')
  2. 执行第1个setTimeout(),将timer1任务放入宏任务队列
  3. 执行第2个setTimeout(),将timer2任务放入宏任务队列
  4. 执行Promise.resolve().then(() => { console.log('promise3') }),将promise3任务放入微任务队列
  5. 执行console.log('end')
  6. 触发下一轮事件循环,第1个宏任务队列中取出timer1任务执行,将promise1任务放入微任务队列
  7. 微任务队列中取出promise3任务执行
  8. 触发下一轮事件循环,第1个宏任务队列中没有任务,执行微任务队列中的promise1任务并将promise2任务放入微任务队列
  9. 微任务队列中取出promise2任务执行

示例二

console.log('start')

setTimeout(() => {
  console.log('timer1')

  Promise.resolve().then(() => {
    console.log('promise1')
  })
}, 0)

Promise.resolve().then(() => {
  console.log('promise2')
})

console.log('end')

输出结果为:

start
end
promise2
timer1
promise1

代码执行过程分析:

  1. 执行console.log('start')
  2. 执行setTimeout(),将timer1任务放入宏任务队列
  3. 执行Promise.resolve().then(() => { console.log('promise2') }),将promise2任务放入微任务队列
  4. 执行console.log('end')
  5. 触发下一轮事件循环,第1个宏任务队列中取出timer1任务执行,将promise1任务放入微任务队列
  6. 微任务队列中取出promise2任务执行
  7. 微任务队列中取出promise1任务执行

面试题分析

以下是一道经典的面试题:

console.log('1')

setTimeout(() => {
  console.log('2')
}, 0)

Promise.resolve().then(() => {
  console.log('3')
})

console.log('4')

输出结果是: 1 4 3 2

这个面试题考察了对事件循环机制的掌握。我们可以根据上述的分析过程,来解释这个题目的输出结果。

  1. 执行console.log('1')
  2. 执行setTimeout(),将2任务放入宏任务队列
  3. 执行Promise.resolve().then(() => { console.log('3') }),将3任务放入微任务队列
  4. 执行console.log('4')
  5. 触发下一轮事件循环,第1个宏任务队列中取出2任务执行
  6. 微任务队列中取出3任务执行

因此,输出结果为:1 4 3 2

综上所述,我们必须掌握JS事件循环机制以及微任务和宏任务的区别,这是学习JS中异步编程非常重要的一步。在面试中,对于事件循环机制和异步编程的问题,也是非常常见的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS事件循环-微任务-宏任务(原理讲解+面试题分析) - Python技术站

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

相关文章

  • javascript 冒泡排序 正序和倒序实现代码

    冒泡排序是一种简单的排序算法,其基本思想是通过比较相邻元素的大小进行排序。在一个数组中,每次比较都会将相邻元素中较大的元素向右移动。重复此过程直到整个数组都按从小到大的顺序排列。 以下是 JavaScript 冒泡排序的正序实现代码: function bubbleSort(arr) { for (let i = 0; i < arr.length -…

    node js 2023年6月8日
    00
  • javascript学习笔记(三)BOM和DOM详解

    当我们学习 JavaScript 时,需要了解 BOM(Browser Object Model,浏览器对象模型)和 DOM(Document Object Model,文档对象模型),这两个模型是 JavaScript 与浏览器之间的接口,通过这两个模型,JavaScript 可以操作浏览器的窗口、框架,以及 HTML 文档的各个元素。 BOM BOM 主…

    node js 2023年6月8日
    00
  • nodejs动态创建二维码的方法

    当我们需要生成二维码时,可能会选择使用前端插件,比如jquery-qrcode等。但是,如果我们想要在后端生成二维码,这时候就需要使用Node.js来实现了。 下面是关于“nodejs动态创建二维码的方法”的完整攻略: 安装QRCode模块 在Node.js中,我们可以使用QRCode模块来生成二维码。在安装QRCode之前,需要先确保 Node.js 环境…

    node js 2023年6月8日
    00
  • 详解nodeJS之路径PATH模块

    详解Node.js之路径模块(Path module) 简介 在Node.js中,核心模块之一是路径模块(Path module)。该模块提供了处理和转换文件路径的工具方法。 使用方式 在Node.js中,我们可以使用require关键字导入路径模块。例如: const path = require(‘path’); 在导入模块后,我们可以使用该模块提供的方…

    node js 2023年6月8日
    00
  • [将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客

    下面是将免费进行到底在Amazon的一年免费服务器上安装Node.JS、NPM和OurJS博客的详细攻略。 确定Amazon实例类型 首先,我们需要在Amazon AWS上选择一种合适的实例类型。根据实际需求,我们可以选择不同的实例类型。此处我们选择性价比较高的t2.micro实例。选择该实例类型的原因在于其拥有1GB内存和1 vCPU的计算能力,并且可以免…

    node js 2023年6月8日
    00
  • Express框架详解app函数使用实例

    Express框架详解app函数使用实例 什么是Express框架 Express是Node.js的一种轻量级Web开发框架。采用MVC框架模式,通过封装Node.js自有的Http模块,提供了一组简洁明了的API,可用于快速编写Web应用程序。Express框架还支持一个插件化的模式,可自由扩展各种组件,能够满足各种Web开发需求。 app函数使用实例 a…

    node js 2023年6月8日
    00
  • 基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架

    针对这个话题,我将从以下几个方面进行详细讲解: 背景介绍 接口配置建模框架的设计思路 接口配置建模框架实现 示例说明 背景介绍 前后端分离已经是现今Web开发的趋势,而在这种架构下,前后端要通过API来进行交互。如何对API的调用进行抽象和封装就变得尤为重要。本文将深入探讨基于NodeJS的前后端分离架构下的一种轻量级的接口配置建模框架的设计和实现过程。 接…

    node js 2023年6月8日
    00
  • 13 个npm 快速开发技巧(推荐)

    13 个npm 快速开发技巧(推荐)攻略 1. 使用 npx 执行命令 npx 是 Node.js 5.2.0 版本中新增的命令,用来执行本地安装的模块。与 npm 命令不同的是,它可以直接执行 npm 仓库中的模块,而无需本地安装。 例如,如果你想要使用 json-server 来创建一个假的 API 服务器,只需运行如下命令即可: npx json-se…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部