【前端面经】JS-事件循环

news2024/11/25 22:37:58

什么是事件循环(Event Loop)?

众所周知, Javascript是一门单线程的语言, 单线程即同一时间只能做一件事, 但这并不意味着JavaScript在执行代码的过程中就会一直阻塞,而解决单线程不阻塞的这个机制就叫做事件循环(Event Loop), 也就是同步异步的概念.

任务执行流程

在JS中, 所有的任务都可以分为了同步任务异步任务

  • 同步任务: 立即执行的任务, 且只有上一个同步任务执行完毕, 才会执行下一个任务

    同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。

  • 异步任务: 即在任务执行时不能立刻得到结果, 而是需要在将来通过一定的手段获取, 则称之为异步任务, 例如网络请求, 定时器, 计时器等

    异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而,异步方法通常会在另外一个线程中,“真实”地执行着。整个过程,不会阻碍调用者的工作。

同步任务与异步任务的运行流程图如下:
在这里插入图片描述

从上图可以看到, 同步任务和异步任务分别进入不同的执行环境, 同步任务进入主线程, 即主执行栈, 异步任务进入任务队列. 主线程内的任务执行完毕至为空时, 回去任务队列读取对应的任务, 推入主线程执行. 上述过程的不断重复就称之为事件循环(Event Loop)

宏任务和微任务

在异步任务中并不像同步任务按顺序执行, 而是再细分为宏任务(macro-task)微任务(micro-task)

每一次Event Loop触发并开始执行异步任务时, 流程如下:

在这里插入图片描述

总结就是:

  • 执行一个宏任务时, 遇到微任务, 会把微任务加入到微任务的事件队列中
  • 当宏任务执行完成后, 再开始依次执行微任务事件队列中的所有微任务

常见的宏任务有:

  • setTimeout/setInterval
  • script(可以理解为外层的同步代码)
  • I/O操作(node.js)

常见的微任务有:

  • Promise的方法
  • Object.observe(已废弃, Proxy对象替代)
  • process.nextTick(node.js)
  • MutaionObserver

实战

读万卷书, 行万里路, 有没有理解掌握, 实战一下便知

console.log('global')

for (var i = 0;i < 3;i ++) {
  setTimeout(function() {
    console.log(i)
  },i*1000)
  console.log(i)
}

new Promise(function (resolve) {
  console.log('promise1')
  resolve()
 }).then(function () {
  console.log('then1')
})

setTimeout(function () {
  console.log('timeout2')
  new Promise(function (resolve) {
    console.log('timeout2_promise')
    resolve()
  }).then(function () {
    console.log('timeout2_then')
  })
}, 0)

分析:

  1. 从上往下执行, 第一个同步任务, 输出’global’
  2. 进入循环, 遇到setTimeout, 将其回调函数加入到异步任务队列中
    • EventTable: [setTimeout(1s), setTimeout(2s), setTimeout(3s)]
  3. 执行log函数, 输出i, 注意这里使用var声明的i
  4. 循环三次, 所以依次输出0, 1, 2
  5. 执行Promise, 执行log函数, 输出’promise1’
  6. 将Promise.then加入到异步任务队列中
    • EventTable: [ setTimeout(0ms), setTimeout(1000ms), setTimeout(3000ms), Promise.then ]
    • 宏任务队列: []
    • 微任务队列: [ Promise.then ]
  7. 将setTimeout加入到异步任务列中
    • EventTable: [ setTimeout1(0ms), setTimeout1(1000ms), setTimeout1(3000ms), Promise.then, setTimeout2(0ms) ]
    • 宏任务队列: []
    • 微任务队列: [ Promise.then ]
  8. 先执行微队列中的任务, 输出’then1’
    • EventTable: [setTimeout1(0ms), setTimeout1(1000ms), setTimeout1(3000ms), setTimeout2(0ms)]
    • 宏任务队列: []
    • 微任务队列: []
  9. 微队列清空, 开始宏队列, 执行setTimeout的回调函数, 因为是var声明的遍历, 所以此时的i已经变成3, 输出setTimeout1(0ms)的3
    • EventTable: [ setTimeout1(1000ms), setTimeout1(3000ms), setTimeout2(0ms) ]
    • 宏任务队列: []
    • 微任务队列: []
  10. 根据时间顺序, Event Table中下一个执行的是seTimeout2(0ms), 执行log函数, 输出’timeout2’
  11. 执行Promise的函数体, 输出’timeout2_promise’
    • EventTable: [ setTimeout1(1000ms), setTimeout1(3000ms), ]
    • 宏任务队列: []
    • 微任务队列: [ Promise2.then ]
  12. 执行Promise.then, 输出’timeout2_then’
    • EventTable: [ setTimeout1(1000ms), setTimeout1(3000ms) ]
    • 宏任务队列: []
    • 微任务队列: []
  13. 依次执行定时器, 输出3, 3

输出:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/475867.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PS滤镜插件-Nik Collection介绍

PS滤镜插件-Nik Collection介绍 什么是Nik CollectionNik Collection都包含什么&#xff1f; 什么是Nik Collection Nik Collection是一款PS滤镜插件套装&#xff0c;其包含了八款PS插件&#xff0c;功能涵盖修图、调色、降噪、胶片滤镜等方面。Nik Collection 作为很多摄影师…

redhat 安装oracle 11g

这里写目录标题 1、数据库下载和安装文档1.2、安装文档1.3、license种类解释&#xff08; XE版 标准本 个人版 企业版&#xff09;1.4、在安装完oracle后再创建数据库1.5、DBA的文档1.6、Automatic Storage Management Administrators Guide1.7、数据库备份恢复手册1.8、Overvi…

系统集成项目管理工程师 笔记(第15章 信息(文档)和配置管理)

文章目录 软件文档的分类&#xff08;1&#xff09;开发文档&#xff1a;描述开发过程 本身&#xff08;2&#xff09;产品文档&#xff1a;描述开发过程的 产物&#xff08;3&#xff09;管理文档&#xff1a;记录项目管理的信息 文档的质量可以分为四级&#xff08;1&#xf…

03_Uboot网络命令与MMC和文件操作命令

目录 网络操作命令 ping命令 nfs 命令 tftp 命令 EMMC和SD卡操作命令 mmc info命令 mmc rescan命令 mmc list 命令 mmc dev 命令 mmc part命令 mmc read 命令 mmc write 命令 mmc erase 命令 FAT 格式文件系统操作命令 fatinfo 命令 fatls 命令 fstype 命令 …

好的代码风格,如同书法,让你的代码更加漂亮

很多初学者的代码其实都不够“漂亮”&#xff0c;那是因为没有养成好的编码习惯。本篇博客以C语言为例&#xff0c;总结一些好习惯。其实&#xff0c;很多习惯都是肌肉记忆&#xff0c;举个例子&#xff1a;请你写一个程序&#xff0c;输入2个整数并输出它们的和。有些朋友可能…

java中的\t说明

阅读前请看一下&#xff1a;我是一个热衷于记录的人&#xff0c;每次写博客会反复研读&#xff0c;尽量不断提升博客质量。文章设置为仅粉丝可见&#xff0c;是因为写博客确实花了不少精力。希望互相进步谢谢&#xff01;&#xff01; 文章目录 阅读前请看一下&#xff1a;我是…

SQLIntegrityConstraintViolationException: Column ‘create_time‘ cannot be null

概述 在使用MySQL MyBatis时遇到的问题&#xff0c;记录一下。 问题 在测试环境里&#xff0c;往MySQL数据表里插入数据时报错&#xff1a;SQLIntegrityConstraintViolationException: Column create_time cannot be null 表结构字段定义&#xff1a; create_time dateti…

【Canvas入门】从零开始在Canvas上绘制简单的动画

这篇文章是观看HTML5 Canvas Tutorials for Beginners教程做的记录&#xff0c;所以代码和最后的效果比较相似&#xff0c;教程的内容主要关于这四个部分&#xff1a; 创建并设置尺寸添加元素让元素动起来与元素交互 设置Canvas的大小 获取到canvas并设置尺寸为当前窗口的大…

Lesson13 IP协议

IP: 提供一种能力,将数据从A主机送到B主机的能力,但不一定会成功 主机 : 配有 IP 地址 , 但是不进行路由控制的设备 ; 路由器: 即配有 IP 地址 , 又能进行路由控制 ; 节点 : 主机和路由器的统称; 协议头格式 如何封装和解包: 定长报头 自描述字段 如何交付(分用) : 8…

Linux驱动之input输入子系统

输入子系统用于实现Linux系统输入设备&#xff08;鼠标 键盘 触摸屏 游戏杆&#xff09;驱动的一种框架。Linux内核将其中的固定部分放入内核&#xff0c;驱动开发时只需要实现其中的不固定部分&#xff08;主要还是和硬件相关的部分&#xff09;&#xff0c;这和platform设备…

离散数学下--- 代数系统

代数系统 定义&#xff1a; 代数系统是用代数运算构造数学模型的方法。 • 通过构造手段生成&#xff0c;所以也称代数结构 • 代数运算&#xff1a;在集合上建立满足一定规则的运算系统 &#xff08;一&#xff09;二元运算 二元运算的定义 二元运算需要满足的两个条件&a…

【P1】Jmeter 准备工作

文章目录 一、Jmeter 介绍1.1、Jmeter 有什么样功能1.2、Jmeter 与 LoadRunner 比较1.3、常用性能测试工具1.4、性能测试工具如何选型1.5、学习 Jmeter 对 Java 编程的要求 二、Jmeter 软件安装2.1、官网介绍2.2、JDK 安装及环境配置2.3、Jmeter 三种模式2.4、主要配置介绍2.4.…

数据结构——二叉树层序遍历

数据结构——二叉树层序遍历 107. 二叉树的层序遍历 II199. 二叉树的右视图思路&#xff1a; 637. 二叉树的层平均值 107. 二叉树的层序遍历 II 107. 二叉树的层序遍历 II 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节…

心血管疾病预测--逻辑回归实现二分类

一、实现效果 实现心血管疾病的预测准确率70%以上 二、数据集介绍 数据共计70000条&#xff0c;其中心血管疾病患者人数为34979&#xff0c;未患病人数为35021。数据特征属性12个分别为如下所示:生理指标(性别、年龄、体重、身高等)、 医疗检测指标(血压、血糖、胆固醇水平等)…

【社区图书馆】PyTorch高级机器学习实战 读书感想

《PyTorch高级机器学习实战》十大特点 1. 深入全面的内容覆盖&#xff1a; 本书的内容深入而全面&#xff0c;涵盖了深度学习中的多个领域&#xff0c;包括自然语言处理、计算机视觉、强化学习等&#xff0c;并介绍了各种不同的神经网络结构和优化算法。 2. 理论和实践并重&am…

scratch拆礼物游戏 中国电子学会图形化编程 少儿编程 scratch编程等级考试三级真题和答案解析2023年3月

目录 scratch拆礼物游戏 一、题目要求 1、准备工作 2、功能实现 二、案例分析 <

java spring 实现 下载hls(m3u8+ts)实时流并进行合并mp4和压缩

参考连接 链接: java下载m3u8视频&#xff0c;解密并合并ts&#xff08;三&#xff09; 链接: Java 下载 HLS (m3u8) 视频 首先需要了解什么是HLS 链接: HTTP Live Streaming (HLS) - 概念 链接: M3U8是什么 简单理解就是, m3u8文件存放着可供客户端播放TS 片段 简单一点…

吴恩达 Chatgpt prompt 工程--1.Guidelines

Setup #安装 !pip install openai#设置key !export OPENAI_API_KEYsk-... # or #import openai #openai.api_key "sk-..."import openai import osfrom dotenv import load_dotenv, find_dotenv _ load_dotenv(find_dotenv())openai.api_key os.getenv(OPENAI_A…

Graph Theory(图论)

一、图的定义 图是通过一组边相互连接的顶点的集合。 In this graph, V { A , B , C , D , E } E { AB , AC , BD , CD , DE } 二、图的类型 2.1 Finite Graph A graph consisting of finite number of vertices and edges is called as a finite graph. Null Graph Tri…

github workflow使用docker部署springboot并推送到阿里云镜像仓库

文章目录 1. 建立你的actions2. 工作流脚本2.1 触发事件2.2 密文和执行参数2.3 deploy.sh执行脚本2.4 Dockerfile 3. 阿里云镜像仓库设置 最近想通过github的workflow部署springboot项目&#xff08;CI&#xff09;&#xff0c;网上看了很多文章&#xff0c;都是有这样那样的问…