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

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

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)。
  • 这个事件被添加到事件队列中,等待事件循环处理。
  1. 事件捕获阶段(如果有):
  • 如果有设置事件捕获阶段的监听器,事件将从顶层元素开始向下传播,执行对应的捕获阶段监听器。
  1. 事件目标阶段:
  • 事件到达目标元素(即点击的按钮)。
  • 执行目标元素上绑定的事件处理函数。
  1. 事件冒泡阶段(如果有):
  • 事件从目标元素开始向上冒泡,依次触发父元素上的事件处理函数。
  • 如果有设置事件冒泡阶段的监听器,也会执行相应的冒泡阶段监听器。

以上是事件处理的基本流程,涉及到事件捕获和事件冒泡两种触发方式。

在事件循环机制中,事件处理涉及到宏任务和微任务的执行。

  • 鼠标点击事件(click event)作为宏任务,被添加到宏任务队列中,等待事件循环执行。该宏任务将在合适的时机被触发。
  • 在宏任务执行时,事件触发后的监听器将被执行。这些监听器可以是通过addEventListener方法注册的函数,也可以是通过html属性直接指定的函数。
  • 如果在事件处理过程中,有使用了Promise或其他微任务机制,相关的微任务将被添加到微任务队列中,在当前宏任务执行完毕后执行。

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

相关文章
|
9月前
|
前端开发 JavaScript 算法
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
transition过渡属性 早期在Web中要实现动画效果,都是依赖于JavaScript或Flash来完成。 但在CSS3中新增加了一个新的模块transition,它可以通过一些简单的CSS事件来触发元素的外观变化, 让效果显得更加细腻。简单点说,就是通过鼠标经过、获得焦点,被点击或对元素任何改变中触发, 并平滑地以动画效果改变CSS的属性值。 在CSS中创建简单的过渡效果可以从以下几个步骤来实现: 在默认样式中声明元素的初始状态样式; 声明过渡元素最终状态样式,比如悬浮状态; 在默认样式中通过添加
426 1
|
9月前
|
前端开发 JavaScript 算法
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
transform变形 css3在原来的基础上新增了变形和动画相关属性,通过这些属性可以实现以前需要大段JavaScript才能实现的 功能。 CSS3的变形功能可以对HTML组件执行位移、旋转、缩放、倾斜4种几何变换,这样的变换可以控制HTML组件 呈现出丰富的外观。 借助于位移、旋转、缩放、倾斜这4种几何变换,CSS3提供了transition动画。 transition动画比较简单,只要指定HTML组件的哪些CSS属性需要使用动画效果来执行变化,并指定动画时间,就可保证动画播放。 比transitio
428 1
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
1051 0
|
算法 Java 关系型数据库
校招 Java 面试基础题目解析及学习指南含新技术实操要点
本指南聚焦校招Java面试,涵盖Java 8+新特性、多线程与并发、集合与泛型改进及实操项目。内容包括Lambda表达式、Stream API、Optional类、CompletableFuture异步编程、ReentrantLock与Condition、局部变量类型推断(var)、文本块、模块化系统等。通过在线书店系统项目,实践Java核心技术,如书籍管理、用户管理和订单管理,结合Lambda、Stream、CompletableFuture等特性。附带资源链接,助你掌握最新技术,应对面试挑战。
273 2
|
Dart 前端开发 架构师
【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升
【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升
724 26
|
前端开发 JavaScript API
前端:事件循环/异步
前端开发中的事件循环和异步处理是核心机制,用于管理任务执行、性能优化及响应用户操作,确保网页流畅运行。事件循环负责调度任务,而异步则通过回调、Promise等实现非阻塞操作。
|
前端开发 开发者 C++
独家揭秘:前端大牛们如何高效学习新技术,保持竞争力!
【10月更文挑战第31天】前端技术飞速发展,如何高效学习新技术成为关键。本文通过对比普通开发者与大牛们的策略,揭示了高效学习的秘诀:明确目标、主动探索、系统资源、实践应用和持续学习。通过这些方法,大牛们能更好地掌握新技术,保持竞争力。示例代码展示了如何通过实践加深理解。
370 4
|
缓存 前端开发 JavaScript
"面试通关秘籍:深度解析浏览器面试必考问题,从重绘回流到事件委托,让你一举拿下前端 Offer!"
【10月更文挑战第23天】在前端开发面试中,浏览器相关知识是必考内容。本文总结了四个常见问题:浏览器渲染机制、重绘与回流、性能优化及事件委托。通过具体示例和对比分析,帮助求职者更好地理解和准备面试。掌握这些知识点,有助于提升面试表现和实际工作能力。
390 1
|
Java 应用服务中间件 程序员
JVM知识体系学习八:OOM的案例(承接上篇博文,可以作为面试中的案例)
这篇文章通过多个案例深入探讨了Java虚拟机(JVM)中的内存溢出问题,涵盖了堆内存、方法区、直接内存和栈内存溢出的原因、诊断方法和解决方案,并讨论了不同JDK版本垃圾回收器的变化。
488 4
|
Web App开发 JavaScript 前端开发
前端Node.js面试题
前端Node.js面试题

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    1229
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    553
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    426
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    428
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    539
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    715
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    1380
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    308
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    1154
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    495