⚡前端底层四连击:Event Loop → 渲染帧 → GC → AST,一篇打通任督二脉

1 Event Loop 执行顺序

  • 同步代码直接执行。
  • 遇到异步任务:
    -- setTimeoutsetIntervalsetImmediate 进入宏任务队列;
    -- Promise.thenqueueMicrotaskMutationObserver 进入微任务队列。
  • 每轮宏任务结束后,先清空微任务队列,再进入下一轮宏任务。
  • 微任务全部执行完后,浏览器进行一次渲染(重排/重绘)。

示例:

js 复制代码
console.log(1);
setTimeout(() => console.log(2), 0);
Promise.resolve().then(() => console.log(3));
console.log(4);
// 输出:1 4 3 2

2 浏览器渲染帧 16.67 ms 流程

  1. 样式计算:把 CSS 规则应用到 DOM 节点。
  2. 布局:计算每个节点的几何信息(位置、大小)。
  3. 绘制:把节点绘制成像素。
  4. 合成:把绘制结果合成到最终屏幕。

若总耗时 > 16.67 ms,页面掉帧。

优化:把动画放在 requestAnimationFrame,避免强制布局抖动。

3 垃圾回收

  • 新生代:对象存活时间短,使用 Scavenge 算法(复制存活对象)。
  • 老生代:对象存活时间长,使用 Mark-Sweep + Mark-Compact 算法(标记-清除-整理)。
  • 闭包泄漏 :函数返回后,其内部变量仍被外部引用,导致无法回收。
    解决:引用置空或使用 WeakMap/WeakRef

示例泄漏:

js 复制代码
function leak() {
  const big = new Array(1e6);
  return () => big.length; // big 被闭包引用
}
const f = leak(); // f 存在期间 big 无法回收

4 AST(抽象语法树)

  • 源代码 → 词法分析 → Tokens → 语法分析 → AST → 字节码 → 机器码。
  • 工具:
    -- esbuild :Go 实现,速度快。
    -- Babel :JavaScript 实现,转译新语法。
    -- Terser:基于 AST 压缩代码。

示例 AST 节点:

js 复制代码
// 源码:a + b
{
  type: 'BinaryExpression',
  operator: '+',
  left: { type: 'Identifier', name: 'a' },
  right: { type: 'Identifier', name: 'b' }
}

速查表

概念 关键点
Event Loop 宏任务→微任务→渲染
渲染帧 16.67 ms 内完成样式→布局→绘制→合成
垃圾回收 新生代复制、老生代标记整理;闭包引用置空
AST 源码→树→字节码→机器码,esbuild/Babel/Terser 基于它

背下这张表,面试不再慌张。

相关推荐
云泽80815 分钟前
二叉树高阶笔试算法题精讲(二):非递归遍历与序列构造全解析
c++·算法·面试
anOnion15 分钟前
构建无障碍组件之Tooltip Pattern
前端·html·交互设计
陈随易24 分钟前
为什么今天还会有新语言?MoonBit 想解决什么问题?
前端·后端·程序员
西洼工作室24 分钟前
unipp+vue3+python h5+app极验验证码集成全流程解析
前端·uni-app·全栈·极验
ZC跨境爬虫25 分钟前
跟着 MDN 学 HTML day_15:(媒体缓冲、拖动与时间范围控制)
前端·笔记·ui·html·edge浏览器·媒体
Cosolar27 分钟前
大型语言模型(LLM)微调与量化技术全指南——从预训练到高效部署
人工智能·后端·面试
李白的天不白40 分钟前
webpack 与 webpack-cli 版本匹配问题
前端·webpack·node.js
tool42 分钟前
Hermes Agent 从安装到生产:我的完整踩坑记录
前端
kyriewen111 小时前
奥特曼借GPT-5.5干杯,而你的Copilot正按Token收钱
前端·gpt·ai·copilot
空中海1 小时前
01 React Native 基础、核心组件与布局体系
javascript·react native·react.js