当前位置: 首页 > news >正文

事件循环_经典面试题

目录

 

代码分析

代码解读

执行顺序

执行结果

结论

文件名:


在JavaScript中,理解事件循环(Event Loop)是掌握异步编程的基础。事件循环决定了代码的执行顺序,包括宏任务(Macrotasks)和微任务(Microtasks)的调度。为了更好地理解事件循环,我们通过一个经典的面试题来展示JavaScript中的异步执行顺序。

代码分析

这是一个简单的HTML文件,包含了一段JavaScript代码,我们可以通过这段代码来分析JavaScript事件循环的执行顺序。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>事件循环经典_经典面试题</title>
</head>

<body>
  <script>
    // 目标:回答代码执行顺序
    console.log(1)
    setTimeout(() => {
      console.log(2)
      const p = new Promise(resolve => resolve(3))
      p.then(result => console.log(result))
    }, 0)
    const p = new Promise(resolve => {
      setTimeout(() => {
        console.log(4)
      }, 0)
      resolve(5)
    })
    p.then(result => console.log(result))
    const p2 = new Promise(resolve => resolve(6))
    p2.then(result => console.log(result))
    console.log(7)
  </script>

</body>

</html>

代码解读

  1. 第一行 console.log(1):

    • 这行代码会被立即执行,输出 1
  2. 第二部分 setTimeout(() => {...}, 0):

    • setTimeout 是一个宏任务(Macrotask),它会被放入任务队列,等待所有同步代码执行完毕后执行。这里设定了0毫秒的延迟,因此它会尽快执行,但仍然会排在所有同步任务之后。
  3. 第三部分 const p = new Promise(resolve => {...}):

    • 创建了一个Promise对象,并且立即执行resolve操作,resolve(5)会将结果5传递给 then 方法。因此,它会进入微任务队列。
  4. 第四部分 const p2 = new Promise(resolve => resolve(6)):

    • 这部分是另一个Promise对象,它会在同步代码执行完毕后立即执行 then 方法,输出6。由于它是同步Promise,它会立即进入微任务队列。
  5. 第五行 console.log(7):

    • 这行代码是同步代码,会直接执行,输出 7

执行顺序

JavaScript的事件循环机制是单线程的,并且执行顺序是严格按照宏任务和微任务的优先级顺序来的。执行顺序如下:

  1. 同步任务 按顺序执行:

    • 输出 1(来自 console.log(1))。
    • 输出 7(来自 console.log(7))。
  2. 微任务 在当前同步任务执行完毕后,立即执行:

    • 输出 6(来自 p2.then(...))。
    • 输出 5(来自 p.then(...))。
  3. 宏任务 执行(微任务执行完后再执行宏任务):

    • 输出 2(来自 setTimeout 中的回调)。
    • 输出 3(来自 p.then(...) 内的 Promise 回调)。
    • 输出 4(来自另一个 setTimeout 内的回调)。

执行结果

1
7
6
5
2
3
4

结论

通过上面的代码执行顺序可以得出,JavaScript事件循环遵循如下的执行优先级:

  1. 同步任务:立即执行。
  2. 微任务:当前同步任务执行完毕后,执行所有微任务。
  3. 宏任务:所有微任务执行完毕后,再开始执行宏任务。

这个例子是一个典型的事件循环模型,展示了宏任务和微任务的执行顺序,帮助我们理解 JavaScript 中的异步执行机制。

文件名:

  • index.html

 

相关文章:

  • 【软件测试】论坛系统功能测试报告
  • 【HCIE实验1】模拟 DHCPv6 服务器及 PD 服务器分配 IPv6 地址和前缀的网络环境。
  • [代码规范]接口设计规范
  • 汽车控制应用对芯片的特殊要求
  • 在分布式系统中,解决因锁持有者故障导致锁无法释放的问题
  • Yocto + 树莓派摄像头驱动完整指南
  • spring boot整合flyway实现数据的动态维护
  • 如何在优云智算平台上面使用deepseek进行深度学习
  • 命名实体识别与文本生成算法
  • 迷你世界脚本组队接口:Team
  • Git学习
  • centos7使用rpm包安装mysql5.6和mysql8.0
  • 如何在docker中的mysql容器内执行命令与执行SQL文件
  • Linux:动静态库
  • (贪心 合并区间)leetcode 56
  • 接口性能优化?
  • 介绍 torch-mlir 从 pytorch 生态到 mlir 生态
  • 《Python实战进阶》No 10:基于Flask案例的Web 安全性:防止 SQL 注入、XSS 和 CSRF 攻击
  • C# 上位机---INI 文件
  • Ubuntu24.04 安装ssh开启22端口及允许root用户远程登录
  • LPR名副其实吗?如果有所偏离又该如何调整?
  • 中国田径巡回赛西安站完赛:男子跳远石雨豪夺冠,女子跳高刘肼毅折桂
  • 江苏疾控:下设部门无“病毒研究所”,常荣山非本单位工作人员
  • 河南一女子被医院强制带走治疗,官方通报:当值医生停职
  • 上海:到2027年,实现近海航线及重点海域5G网络高质量覆盖
  • 张家界一铁路致17人身亡,又有15岁女孩殒命,已开始加装护栏