No100.精选前端面试题,享受每天的挑战和学习(事件循环)

news2024/9/20 5:49:47

在这里插入图片描述

文章目录

    • 1. 请解释一下JavaScript中的事件循环(Event Loop)是什么,并描述其工作原理。
    • 2. 请解释一下JavaScript中的宏任务(macro-task)和微任务(micro-task)的区别
    • 3. 在事件循环中,什么是同步任务,什么是异步任务?它们分别是如何处理的?
    • 4. 请解释一下setTimeout和setImmediate之间的区别,以及它们在事件循环中的执行顺序。
    • 5. 在异步编程中,Promise和回调函数有什么区别?它们在事件循环中的执行顺序又是如何的?
    • 6. 在浏览器中,当用户点击页面上的按钮时,事件是如何被处理的?请描述整个过程涉及到的事件循环机制。
    • 附录:「简历必备」前后端实战项目(推荐:⭐️⭐️⭐️⭐️⭐️)

📈「作者简介」:前端开发工程师 | 蓝桥云课签约作者 | 技术日更博主 | 已过四六级
📚「个人主页」:阿珊和她的猫
🕐「简历必备」前后端实战项目(推荐:⭐️⭐️⭐️⭐️⭐️)

  • Vue.js 和 Egg.js 开发企业级健康管理项目
  • 带你从入门到实战全面掌握 uni-app

1. 请解释一下JavaScript中的事件循环(Event Loop)是什么,并描述其工作原理。

JavaScript中的事件循环(Event Loop)是一种机制,用于处理异步任务和事件的执行顺序。它是JavaScript运行时环境的一部分,如浏览器或Node.js环境,负责协调和分配可执行的任务。

事件循环的工作原理可以简单地描述为以下几个步骤:

  1. 执行同步任务:首先,JavaScript引擎会执行当前执行栈中的同步任务,也就是按照代码的顺序依次执行。

  2. 执行微任务:在执行完同步任务后,事件循环会检查是否存在微任务(micro-tasks)。微任务是一类优先级较高的任务,它们的执行顺序在下一个步骤之前确定。常见的微任务包括Promise的回调函数、MutationObserver的回调函数等。事件循环会一直执行所有的微任务队列,直到清空。

  3. 执行宏任务:在执行完所有的微任务后,事件循环会检查宏任务(macro-tasks)队列。宏任务是一类优先级较低的任务,包括定时器回调函数(setTimeout、setInterval)、用户交互事件、网络请求等。事件循环会从宏任务队列中选择一个任务出来执行。

  4. 更新渲染:在执行宏任务期间,如果需要对界面进行渲染,事件循环会执行相应的渲染操作。

  5. 继续下一轮循环:完成当前选中的宏任务后,事件循环重新回到第2步,开始执行微任务,然后再执行宏任务,循环往复,直到没有更多的任务需要执行。

这个事件循环的过程保证了JavaScript运行环境的响应能力和单线程特性。通过合理地处理微任务和宏任务,我们可以编写出高效、响应迅速的JavaScript代码。

在这里插入图片描述

2. 请解释一下JavaScript中的宏任务(macro-task)和微任务(micro-task)的区别

在JavaScript中,宏任务(macro-task)和微任务(micro-task)是两种不同类型的异步任务,它们具有不同的执行时机和执行优先级。

宏任务(macro-task)是指需要在事件循环的下一轮执行的任务。
它们被放入宏任务队列中,按照顺序执行,每次只执行一个宏任务。
当宏任务队列为空时,JS引擎会等待新的宏任务加入队列。

常见的宏任务包括:

  1. 定时器回调函数(setTimeout、setInterval)
  2. 用户交互事件(点击、滚动、输入等)
  3. 网络请求(AJAX、fetch)
  4. 文件读写操作
  5. UI 重渲染

在这里插入图片描述

微任务(micro-task)是一类优先级较高的任务,它们在当前宏任务执行完毕后立即执行,而不需要等待下一轮事件循环。微任务队列在每次宏任务执行完毕后清空,直到微任务队列为空。常见的微任务包括:

  1. Promise 的回调函数
  2. MutationObserver 的回调函数
  3. process.nextTick(仅适用于Node.js环境)
  4. queueMicrotask 函数添加的任务

在这里插入图片描述

区别总结如下:

  1. 执行时机:宏任务在事件循环的下一轮执行,而微任务会在当前任务执行完毕后立即执行。
  2. 执行顺序:微任务的优先级高于宏任务,即微任务会优先执行。
  3. 嵌套关系:宏任务之间相互独立,而微任务可以在一个宏任务中产生另一个微任务。

在编写异步JavaScript代码时,正确理解和使用宏任务和微任务非常重要。微任务经常用于处理Promise的响应、状态更新和DOM操作,它们能够提供更精确的控制和更快的响应性能。

3. 在事件循环中,什么是同步任务,什么是异步任务?它们分别是如何处理的?

在事件循环中,同步任务和异步任务是两种不同类型的任务。

同步任务是按照代码的顺序依次执行的任务。它们会阻塞代码的执行,直到任务完成后才继续执行下一个任务。
同步任务通常包括变量声明、函数调用、循环等操作。

异步任务是指不会立即执行的任务,而是在将来的某个时间点执行的任务。它们不会阻塞代码的执行,允许其他任务继续执行。异步任务通常涉及到 I/O 操作、网络请求、定时器等

异步任务的处理方式如下:

  1. 触发异步任务异步任务的启动是通过API调用来触发的,例如 XMLHttpRequestsetTimeout 等。

  2. 将异步任务添加到任务队列:在触发异步任务后,它们会被放入相应的任务队列中,等待事件循环处理。

  3. 事件循环中的轮询:事件循环在循环中检查任务队列,看是否有可执行的任务。

  4. 执行异步任务:当任务队列中有异步任务时,事件循环将其取出并执行,可能会涉及回调函数的执行或其他操作。

需要注意的是,异步任务的执行时机并不是确定的,它们依赖于外部因素,如网络延迟、计时器的设置等。执行异步任务时,可以注册回调函数或使用Promise来处理结果。

总结起来:

  • 同步任务按照代码顺序执行,阻塞代码的执行。
  • 异步任务不会立即执行,通过触发 API 调用,在事件循环中处理,不阻塞代码的执行。
  • 异步任务通过将其放入任务队列中,等待事件循环处理。
  • 异步任务的执行时机不确定,依赖于外部因素。

4. 请解释一下setTimeout和setImmediate之间的区别,以及它们在事件循环中的执行顺序。

setTimeoutsetImmediate是两种常见的用于延迟执行代码的函数,它们在事件循环中有一些区别。

setTimeout是一个定时器函数,用于在一定的延迟时间后执行一个回调函数。它接受两个参数:回调函数和延迟时间(以毫秒为单位)。setTimeout的延迟时间是一个相对时间,表示在指定的延迟之后将回调函数插入宏任务队列中。

setImmediate是一个Node.js提供的函数,用于在当前宏任务执行完毕后立即执行回调函数。它的回调函数会被插入到一个专门用于处理setImmediate回调的微任务队列中。

在事件循环中,setTimeoutsetImmediate的执行顺序如下:

  1. 当代码执行到setTimeout时,它会将回调函数插入宏任务队列中,并设定延迟时间

  2. 当代码执行到setImmediate时,它会立即将回调函数插入微任务队列中,等待当前宏任务执行完毕

  3. 在执行宏任务阶段,事件循环会先从宏任务队列中选取一个任务来执行。如果当前没有其他宏任务,则会继续执行微任务队列中的所有微任务。

  4. 执行完所有的微任务之后,事件循环会检查宏任务队列中是否还有任务。如果有,则选取下一个宏任务执行。

  5. 因此,setTimeout的回调函数会在延迟时间到达后被插入到宏任务队列中,而setImmediate的回调函数会在当前宏任务执行完毕后立即执行。

总结起来,setTimeout和setImmediate在事件循环中的执行顺序是:setTimeout的回调函数会在延迟时间过后被插入到宏任务队列中,而setImmediate的回调函数会在当前宏任务阶段执行完毕后立即执行

5. 在异步编程中,Promise和回调函数有什么区别?它们在事件循环中的执行顺序又是如何的?

Promise和回调函数都是用于处理异步编程的常见方式,它们有一些区别,包括语法、可读性和处理方式等方面。

  1. 语法和可读性Promise采用了更加直观的链式调用方式(例如.then()和.catch()),使得代码更易读、易于理解和维护。而回调函数则需要在每一个异步操作中传递回调函数,导致代码嵌套层级较深,可读性较差。

  2. 错误处理Promise提供了全局的错误处理机制,通过.catch()方法可以捕获和处理Promise链中的错误。而回调函数通常需要手动处理错误,对错误的处理有一定的限制。

  3. 异步流程控制Promise支持链式调用,可以通过.then()方法串联多个异步操作,形成更清晰的异步流程控制。而回调函数在复杂的异步操作中可能需要嵌套多层回调,导致代码难以维护。

在事件循环中,Promise和回调函数的执行顺序如下:

  1. Promise在执行过程中,会立即返回一个Promise对象,在回调函数中使用resolve()或reject()方法与Promise的状态进行交互。

  2. 当Promise的状态变为已完成(fulfilled)或已拒绝(rejected)时,它会将相应的回调函数放入微任务队列中,等待执行。

  3. 在当前宏任务执行完毕后,事件循环会检查微任务队列,并按顺序执行其中的任务。

  4. 回调函数作为微任务,会优先执行,可以得到较高的优先级。

总结起来,Promise和回调函数在事件循环中的执行顺序是:Promise的状态改变时,它将回调函数放入微任务队列中;而回调函数作为微任务,在当前宏任务执行完毕后优先执行。这样,可以保证将异步操作的处理延迟到合适的时机,提供更好的异步流程控制和可读性。

6. 在浏览器中,当用户点击页面上的按钮时,事件是如何被处理的?请描述整个过程涉及到的事件循环机制。

当用户在浏览器中点击页面上的按钮时,涉及到以下事件处理过程,其中包括事件触发、事件捕获、事件冒泡和事件处理。

  1. 事件触发阶段:

    • 用户点击按钮的操作会触发一个鼠标点击事件(click event)。
    • 这个事件被添加到事件队列中,等待事件循环处理。
  2. 事件捕获阶段(如果有):

    • 如果有设置事件捕获阶段的监听器,事件将从顶层元素开始向下传播,执行对应的捕获阶段监听器。
  3. 事件目标阶段:

    • 事件到达目标元素(即点击的按钮)。
    • 执行目标元素上绑定的事件处理函数。
  4. 事件冒泡阶段(如果有):

    • 事件从目标元素开始向上冒泡,依次触发父元素上的事件处理函数。
    • 如果有设置事件冒泡阶段的监听器,也会执行相应的冒泡阶段监听器。

以上是事件处理的基本流程,涉及到事件捕获和事件冒泡两种触发方式。
在事件循环机制中,事件处理涉及到宏任务和微任务的执行。

  • 鼠标点击事件(click event)作为宏任务,被添加到宏任务队列中,等待事件循环执行。该宏任务将在合适的时机被触发。

  • 在宏任务执行时,事件触发后的监听器将被执行。这些监听器可以是通过addEventListener方法注册的函数,也可以是通过html属性直接指定的函数。

  • 如果在事件处理过程中,有使用了Promise或其他微任务机制,相关的微任务将被添加到微任务队列中,在当前宏任务执行完毕后执行。

总结起来,在浏览器中,当用户点击页面上的按钮时,触发的事件会被添加到宏任务队列中,等待事件循环处理。事件会经历事件触发、捕获、目标、冒泡等阶段,并在其中执行相应的事件处理函数。同时,如果有微任务存在,它们会在当前宏任务执行完毕后被执行。

附录:「简历必备」前后端实战项目(推荐:⭐️⭐️⭐️⭐️⭐️)

Vue.js 和 Egg.js 开发企业级健康管理项目
带你从入门到实战全面掌握 uni-app

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

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

相关文章

PS - Photoshop 抠图与剪贴蒙版功能与 Stable Diffusion 重绘

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131978632 Photoshop 的剪贴蒙版是一种将上层图层的内容限制在下层图层的形状范围内的方法,也就是说,上层图层只能在下层图…

PLC的高端版本通常具有以下特点:

高速处理能力:高端PLC通常具有更快的处理速度和更高的运行频率,可以处理更复杂的控制逻辑和更多的输入/输出信号。 大容量存储:高端PLC通常具有更大的存储容量,可以保存更多的程序和数据,以满足更复杂的应用需求。 多种…

Java 源码打包 降低jar大小

这里写目录标题 Idea maven 插件配置pom.xml 配置启动技巧 Idea maven 插件配置 pom.xml 配置 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><!-- 只…

html学习1

1、<!DOCTYPE html>用来告知 Web 浏览器页面使用了哪种 HTML 版本。 2、对于中文网页需要使用 <meta charset"utf-8"> 声明编码&#xff0c;否则会出现乱码。 3、html的结构图&#xff0c;<body> </body>之间的部分可以显示。 4、HTML元素…

Circuit hdu7322

Problem - 7322 题目大意&#xff1a;有一个n个点的边权有向图&#xff0c;求图中环的权的最小值以及相应最小环的数量 1<n<500 思路&#xff1a;要求一个如下图的环的大小&#xff0c;我们只需知道u到v的最短路径加上v到u的边权 这样的话我们需要求出任意两点之间的最…

【matlab】机器人工具箱快速上手-正运动学仿真(代码直接复制可用)

安装好机器人工具箱&#xff0c;代码复制可用&#xff0c;按需修改参数 1.建模 %%%%%%%%SCARA机器人仿真模型 l[0.457 0.325]; L(1) Link(d,0,a,l(1),alpha,0,standard,qlim,[-130 130]*pi/180);%连杆1 L(2)Link(d,0,a,l(2),alpha,pi,standard,qlim,[-145 145]*pi/180);%连杆…

前端开发Vue3.0 标签setup语法『UI组件库』之『模态框』【业务提升必备】

封装模态框需要定义的参数 title //弹窗标题 show // 是否显示弹窗 width // 弹窗宽度 height // 弹窗高度 borderRadius // 弹窗圆角 headerColor // 弹窗顶部颜色 contentText // 内容文本 contentTextCorder //内容文本颜色 position // 标题的位置 …

暴力猴插件开发简明教程->百度首页默认设置为我的关注

文章目录 暴力猴插件开发简明教程->百度首页默认设置为我的关注缘起缘灭思路实现尾声 暴力猴插件开发简明教程->百度首页默认设置为我的关注 缘起 在我的百度首页有很多自己设置的导航链接(接近100个),里面放了我常用的网站, 如下图 但是最近一段时间, 我发现百度做了一…

腾讯云 CODING 成为首批 TISC 企业级平台工程综合能力要求标准贡献单位

点击链接了解详情 今天&#xff0c;由中国信通院主办的“2023 数字生态发展大会”暨中国信通院“铸基计划”年中会议在京召开。本次大会全面总结了“铸基计划”上半年度工作成果&#xff0c;帮助行业解析数字化转型发展趋势&#xff0c;链接供给侧和需求侧企业&#xff0c;以期…

2022年数学建模国赛c题论文+代码(附详解)

古代玻璃制品化学成分的分析与研究 摘要 古代玻璃极易受埋藏环境的影响而风化&#xff0c;并且在风化过程中&#xff0c;内部元素与环境元素进行着大量交换&#xff0c;导致其成分比例会发生变化&#xff0c;从而会影响对其类别的正确判断。玻璃在炼制的过程中需要添加助熔剂…

【Git】修改文件版本回退撤销修改删除文件

文章目录 修改文件版本回退git reset语法规则注意 撤销修改情况1&#xff1a;工作区的代码还未add情况2&#xff1a;工作区的代码已经add 但未commit情况3&#xff1a;工作区的代码已经add 并且已经 commit 删除文件 修改文件 Git⽐其他版本控制系统设计得优秀&#xff0c;Git…

postgresgl数据库的部署与优化

文章目录 一.postgresgl数据库1.postgresgl数据库的概念1.1 PostgreSQL 的核心概念 2.PostgreSQL特点3.PostgreSQL的作用4.PostgreSQL的应用场景5.PostgreSQL、mysql、oracle的对比 二.Linux系统安装PostgresSQL&#xff08;Centos7&#xff09;1.更新yun源2.安装PostgreSQL2.1…

Vue的router学习

,前端路由的核心是什么呢&#xff1f;改变URL&#xff0c;但是页面不进行整体的刷新。 vue-router是基于路由和组件的  路由用于设定访问路径, 将路径和组件映射起来&#xff1b;  在vue-router的单页面应用中, 页面的路径的改变就是组件的切换&#xff1b; 使用router需要…

QT 使用串口

目录 1.1.1 添加库&#xff0c;添加类 1.1.2 定义串口 1.1.3 搜索串口 1.1.4 设置和打开串口 1.1.5 读取数据 1.1.6 发送数据 1.1.7 关闭串口 1.1.1 添加库&#xff0c;添加类 首先&#xff0c;QT5 是自带 QSerialPort(Qt5 封装的串口类)这个类的&#xff0c;使用时…

单相锁相环原理与代码实战解释

单相锁相环程序原理如下图所示 单相锁相环原理 锁相环&#xff08;PLL&#xff09;是一种常用于同步、解调和信号处理等领域的电路或数字算法&#xff0c;其主要作用是将一个输入信号的相位与频率与参考信号进行精确的匹配。这里我们来简单解释一下单相锁相环的原理和分析。 …

自媒体行业下滑的5个标志

我是卢松松&#xff0c;洞察草根行业趋势&#xff01;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 未来大量的自媒体人将面临失业&#xff0c;80%的自媒体人收益没办法养活自己。前两天卢克文说自媒体的发展其实已经到达巅峰期&#xff0c;慢慢开始走下坡路了。我认…

Java集合框架的全面分析和性能增强

Java集合框架的全面分析和性能增强 &#x1f497;摘要&#xff1a;&#x1f497; 1. Java集合框架概述&#x1f497;1.1 Collection接口1.1.1 List接口1.1.2 Set接口1.1.3 Queue接口 &#x1f497;1.2 Map接口 &#x1f497;2. Java集合框架性能优化&#x1f497;2.1 选择合适的…

vue新学习 02 vue命令v-model,数据代理(作用域和作用域链),事件,监听,条件渲染,计算属性(也就是把操作属性的语句放到vue实例中)

双向绑定用命令v-model&#xff1a; v-bind的命令是单项去绑定data中的相关属性&#xff0c;此时的data是真正的data&#xff0c;并没有用变量声明的方式去接收vue实例对象&#xff0c;也就是例如用const vm new Vue({})。而是直接就采用了new Vue&#xff08;{}&#xff09;这…

戴琼海院士——人工智能正深刻地改变这个时代

原创 | 文 BFT机器人 2023世界人工智能大会将继续发挥“科技风向标、应用展示台、产业加速器、治理议事厅”的重要作用&#xff0c;打造“会议论坛、展览展示、评奖赛事、应用体验”四大核心内容&#xff0c;汇聚世界顶级科学家、企业家、政府官员、专家学者、国际组织、投资人…

Ssm+Mysql实现的Java Web酒店管理项目源码附带视频指导运行教程及需求文档

由ssmmysql实现的一款酒店管理系统&#xff0c;该系统实现了酒店客房预订管理的基本功能&#xff0c;还增加了图表显示统计结果的功能有需要的可以联系我分享给大家&#xff0c;下面是运行后的一些截图&#xff1a;