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

【超详细】面试中问到事件循环(Event Loop)机制?

事件循环机制

    • 1. 进程与线程
    • 2. 事件循环机制
    • 3. 事件循环机制的执行步骤
    • 4. 图解执行顺序

1. 进程与线程

1.进程

  • 定义:进程是操作系统分配资源(如内存、CPU)的基本单位,每个进程独立运行且用于独立的内存
  • 前端场景:浏览器中最上方每个标签页通常都对应一个独立的渲染进程,负责处理网页内容的进程(解析HTML【转换为DOM树】、CSS【处理样式表】、执行js、渲染页面【将DOM和CSS结合生成渲染树】)
  • 特点:
    (1) 稳定性【一个标签页的崩溃,不会影响其他标签页或浏览器主进程】
    (2) 安全性:进程之间隔离
    (3) 性能:多进程能充分利用CPU,并行处理多个页面渲染任务
    (4) 沙盒化:渲染进程运行在沙盒(Sandbox)中,限制对系统资源直接访问,增强安全性

沙盒是一种安全机制,用于隔离运行环境,限制程序或代码的访问权限,防止对系统或其他程序造成破坏。

  1. 线程
  • 定义:线程是进程内的执行单位,共享进程的资源,是CPU调度的最小单位。
  • 前端场景:渲染进程包含多个协作进程,如JS引擎线程、GUI渲染线程等,共同完成页面交互和渲染。

JS引擎线程:处理页面在的所有逻辑(js代码)。

  1. 单线程,同一时间只能执行一个任务,因此长时间运行的JS代码会阻塞页面渲染
  2. 与渲染线程互斥:当JS引擎线程执行时,GUI渲染线程会被挂起
  3. JS是单线程模型,通过事件循环机制处理异步操作,避免主线程阻塞

GUI渲染线程

  1. 构建DOM树和CSSOM树,合并为渲染树;计算元素位置、大小最终将像素输出到屏幕
  2. 重绘与回流:当页面样式或结构发生变化则触发重新渲染。

2. 事件循环机制

是浏览器V8引擎按照先执行同步代码、再执行异步代码,如此反复执行的一种策略。

V8:是 JavaScript 的高性能执行引擎,广泛应用于 Chrome 和 Node.js
将js代码转换为机器码(CPU能直接执行的指令),大幅度提升运行速度
核心优化:(JIT )即时编译、隐藏类、内联缓存、高效 垃圾回收(GC)

3. 事件循环机制的执行步骤

在这之前需要理解宏任务和微任务

  1. 宏任务:是指由JavaScript主线程执行的任务,它包括但不限于以下情况:
  • 浏览器事件(如click、mouseover等)
  • 定时器任务(setTimeout、setInterval)
  • 页面渲染(如回流/重绘)
  • 网络请求(如fetch/XHMLHttpRequest)
    (涉及I/O操作,需要异步等待,所以是宏任务,then是微任务,请求完成后触发)
    在这里插入图片描述

宏任务通常独立于当前任务,并按顺序排队执行。先执行当前宏任务中的同步代码,再处理微任务,最后按队列顺序取下一个宏任务

  1. 微任务:是指由JavaScript引擎执行的任务,在宏任务之后执行,但在下一次渲染之前执行。微任务通常是由宏任务中的某个特定任务触发的,并立即执行。常见的微任务:
  • Promise.then回调函数
  • Async/await函数
  • nextTick()

✅ 异步操作分两类:

  • 宏任务异步(如setTimeout):放入任务队列,等待下次事件循环

  • 微任务异步(如Promise.then):放入微任务队列,当前宏任务结束后立即执行
    (即当前宏任务结束,立即清空微任务队列)

实例:

console.log("1");
setTimeout(()=>{console.log("2");Promise.resolve().then(()=>console.log("3"));	
});
Promise.resolve().then(()=>console.log("4"));
console.log("5");

解释:

  1. 在当前第一个宏任务中,先执行其中同步任务:打印15
  2. 第一个宏任务中使用setTimeout创建一个回调函数,将其添加到宏任务队列中等待执行。
  3. Promise.resolve().then(()=>console.log("4"));中回调函数首先会被添加到微任务队列中。在第一个宏任务执行结束后,立即执行微任务队列中的回调函数:打印4
  4. 开始执行第二个宏任务(宏任务队列中取出),打印:2
  5. 然后第二个宏任务中的Promise回调函数()=>console.log("3")会被添加到微队列当中等待执行
  6. 本轮事件循环结束执行微队列任务,打印3

4. 图解执行顺序

由此形成事件循环
在这里插入图片描述

相关文章:

  • 如何本地部署Qwen3系列的大小模型235B/32B并进行推理服务及并发测试?
  • C#自定义扩展方法 及 EventHandler<TEventArgs> 委托
  • 【linux驱动】【设备树】按键设备树讲解
  • WaterStamp —— 一个实用的网页水印生成器开发记
  • 【周输入】510周阅读推荐-3
  • c/c++数据类型转换.
  • 二:操作系统之进程控制块(PCB)
  • Selinux权限问题处理指导文档分享
  • 菱形继承原理
  • 中国与全球电子取证行业市场报告(公开信息版)
  • 暴雨大讲堂:高性能计算面临的芯片挑战
  • 牛客网NC210769: 字母大小写转换问题解析
  • HJ5 进制转换【牛客网】
  • Python 中二维列表(list)(嵌套列表)详解
  • uWSGI是什么?
  • Java中关于方法的调用和递归
  • 【cursor】有效解决
  • Appium自动化测试环境搭建及配置
  • 西门子1200/1500博图(TIA Portal)寻址方式详解
  • AI 制作游戏美术素材流程分享(程序员方向粗糙版)
  • 新冠阳性率升高,专家:新冠变异株致病力没太多变化
  • AI快速迭代带来知识焦虑,褚君浩院士提出“四维能力模型”
  • 解锁儿时愿望!潘展乐战胜孙杨,全国冠军赛男子400自夺冠
  • 联合国:欢迎俄乌伊斯坦布尔会谈,希望实现全面停火
  • 浙江演艺集团7部作品组团来沪,今夏开启首届上海演出季
  • 本周看啥|《歌手》今晚全开麦直播,谁能斩获第一名?