<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>字节-商业化-社招-4年 on Last Stand</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/</link><description>Recent content in 字节-商业化-社招-4年 on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 27 Jul 2025 09:29:18 +0000</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/index.xml" rel="self" type="application/rss+xml"/><item><title>字节-商业化-社招-4年 · 第 1 轮 · 二面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/round-75/</link><pubDate>Sun, 27 Jul 2025 09:29:18 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/round-75/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/round-74/"&gt;第 1 轮&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/"&gt;返回本次面经&lt;/a&gt; · 已是最后一轮 →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; Web Storage、离线存储、浏览器解析 HTML 文件、浏览器渲染过程、浏览器的缓存机制、浏览器的存储机制&lt;/p&gt;
&lt;p&gt;本轮共 22 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-ce6113579300"&gt;1. 讲一下你的3D渲染的项目&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-ebd16eff00d0"&gt;2. 3D渲染顶点着色、剪裁你是怎么实现的&lt;/h2&gt;
&lt;h3 id="题目要点-1"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-8eb47b712b62"&gt;3. 顶点着色阶段中的坐标变换通常包括哪些步骤？为什么剪裁能提升性能&lt;/h2&gt;
&lt;h3 id="题目要点-2"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-8945e274e9c1"&gt;4. 在透视投影中，为什么需要视口变换（Viewport Transformation）&lt;/h2&gt;
&lt;h3 id="题目要点-3"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-efecf9c06939"&gt;5. 像素着色阶段的任务是什么？它如何与光照模型（如Phong或Blinn-Phong）结合&lt;/h2&gt;
&lt;h3 id="题目要点-4"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-229eab953c10"&gt;6. 延迟渲染（Deferred Rendering）与前向渲染（Forward Rendering）在像素着色阶段的区别&lt;/h2&gt;
&lt;h3 id="题目要点-5"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-5144c067ddb5"&gt;7. 深度缓冲（Z-Buffer）的工作原理是什么&lt;/h2&gt;
&lt;h3 id="题目要点-6"&gt;题目要点&lt;/h3&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;p&gt;略&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-f54eec84ec45"&gt;8. 浏览器绘制一帧的完整流程（从输入事件到像素合成）&lt;/h2&gt;
&lt;h3 id="题目要点-7"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;理清浏览器渲染从事件到显示的每个关键步骤。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;解释每个阶段的作用和产生的结果。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;强调布局、绘制和合成的性能开销及优化手段。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合实际开发中的性能调优措施说明。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解浏览器渲染的全流程"&gt;● 理解浏览器渲染的全流程&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察从用户输入到最终视觉呈现的各个环节。&lt;/p&gt;
&lt;h4 id="-掌握事件处理样式计算布局绘制和合成机制"&gt;● 掌握事件处理、样式计算、布局、绘制和合成机制&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察对浏览器渲染流水线各阶段的深入理解。&lt;/p&gt;
&lt;h4 id="-理解性能瓶颈和优化点"&gt;● 理解性能瓶颈和优化点&lt;/h4&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h3 id="一浏览器绘制一帧的整体流程概览"&gt;一、浏览器绘制一帧的整体流程概览&lt;/h3&gt;
&lt;p&gt;从用户输入事件触发，到最终屏幕显示，浏览器大致执行以下步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;事件处理（Input Handling）&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript 执行（JS Execution）&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;样式计算（Style Recalculation）&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;布局计算（Layout / Reflow）&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;绘制（Painting）&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;合成（Compositing）&lt;/strong&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;像素呈现（Rasterization &amp;amp; Display）&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="二详细流程解析"&gt;二、详细流程解析&lt;/h3&gt;
&lt;h4 id="1-用户输入事件处理"&gt;1. 用户输入事件处理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;浏览器捕获用户的输入事件（如点击、滚动、键盘等），将事件放入事件队列。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;主线程从事件队列中取出事件，执行对应的事件处理程序（如回调函数）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-javascript-执行"&gt;2. JavaScript 执行&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;事件处理回调可能修改 DOM 或样式。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;JavaScript 运行在浏览器主线程，操作 DOM 会影响后续渲染。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-样式计算style-recalculation"&gt;3. 样式计算（Style Recalculation）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;浏览器根据最新的 DOM 结构和 CSS 规则，计算每个元素的最终样式。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;可能触发样式树（style tree）的重建或更新。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="4-布局计算layout--reflow"&gt;4. 布局计算（Layout / Reflow）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;计算元素的几何信息（大小、位置等），生成布局树（layout tree）。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;重新计算会影响元素相对或绝对位置。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;这是性能较昂贵的过程，尤其是节点多或频繁触发。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="5-绘制painting"&gt;5. 绘制（Painting）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;将布局树转换为绘制指令（绘制图层的内容），如颜色、文字、边框等。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;生成绘制层（paint layers），具体绘制到图层画布（layer canvas）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="6-合成compositing"&gt;6. 合成（Compositing）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;多个绘制层按照层级关系组合（合成）成最终页面。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;使用 GPU 加速合成，将图层合并为一张完整的图像。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;合成阶段可以通过硬件加速提升性能，避免全部重绘。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="7-像素呈现rasterization--display"&gt;7. 像素呈现（Rasterization &amp;amp; Display）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;将合成后的图像转换成屏幕像素。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;GPU 或显示设备将最终像素渲染到屏幕，完成一帧的视觉呈现。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="三流程图示意"&gt;三、流程图示意&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;用户输入 → 事件处理 → JS 执行 → 样式计算 → 布局 → 绘制 → 合成 → 屏幕显示
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="四优化与注意点"&gt;四、优化与注意点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;避免频繁触发布局和绘制&lt;/strong&gt;，减少重排和重绘次数。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;使用 CSS3 硬件加速属性（transform、opacity）优化合成性能。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;将复杂动画放入合成层，减少主线程压力。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;合理分层减少合成开销，避免过度分层。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;减少 JavaScript 执行时间，避免阻塞主线程。&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-e6f4b305ea7b"&gt;9. 追问：requestAnimationFrame（RAF）在哪个阶段执行？为什么它比setTimeout更适合动画&lt;/h2&gt;
&lt;h3 id="题目要点-8"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;明确 RAF 在浏览器渲染流程中“绘制前”执行。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;解释 RAF 与浏览器刷新同步，自动节流的机制。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;对比 setTimeout，突出 RAF 动画性能和体验优势。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;强调实际开发中推荐使用 RAF 实现动画更新。&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="一requestanimationframe-执行阶段"&gt;一、requestAnimationFrame 执行阶段&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;requestAnimationFrame 回调函数执行时机&lt;/strong&gt;：&lt;br&gt;
RAF 的回调函数会在浏览器开始&lt;strong&gt;下一次渲染帧之前&lt;/strong&gt;执行，即在 &lt;strong&gt;浏览器渲染管线中的“绘制（Painting）”之前&lt;/strong&gt;或合成前的空隙期。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;具体来说，RAF 的回调是在浏览器完成一帧的布局（Layout）和样式计算（Style Recalculation）之后，&lt;strong&gt;紧接着准备绘制和合成之前&lt;/strong&gt;触发，保证动画逻辑与渲染同步。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="二为什么-raf-比-settimeout-更适合动画"&gt;二、为什么 RAF 比 setTimeout 更适合动画&lt;/h3&gt;
&lt;h4 id="1-与浏览器刷新频率同步"&gt;1. 与浏览器刷新频率同步&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;RAF 会按照屏幕刷新频率（通常是 60fps，即约 16.7ms 一帧）自动调用回调，保证动画平滑且不卡顿。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;setTimeout 不与渲染同步，回调可能在任意时刻执行，导致动画帧率不稳定甚至丢帧。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="2-自动节流和性能优化"&gt;2. 自动节流和性能优化&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;浏览器在后台标签页会自动暂停 RAF 调用，节省资源；而 setTimeout 仍然会尝试执行，浪费性能。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;RAF 允许浏览器合并多次绘制请求，提升性能。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-减少视觉撕裂"&gt;3. 减少视觉撕裂&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;由于 RAF 在绘制之前触发，能保证动画状态在绘制前更新，减少视觉撕裂和跳帧现象。&lt;br&gt;&lt;/li&gt;
&lt;li&gt;setTimeout 可能导致更新与渲染不同步，画面不连贯。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="三总结"&gt;三、总结&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特点&lt;/th&gt;
&lt;th&gt;requestAnimationFrame&lt;/th&gt;
&lt;th&gt;setTimeout&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;执行时机&lt;/td&gt;
&lt;td&gt;渲染帧开始前（绘制前）&lt;/td&gt;
&lt;td&gt;指定时间后，非渲染同步&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;帧率同步&lt;/td&gt;
&lt;td&gt;与显示器刷新率同步，平滑动画&lt;/td&gt;
&lt;td&gt;不保证同步，可能导致跳帧&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;性能优化&lt;/td&gt;
&lt;td&gt;后台标签页自动暂停，节约资源&lt;/td&gt;
&lt;td&gt;即使后台也运行，浪费性能&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;视觉效果&lt;/td&gt;
&lt;td&gt;减少撕裂，动画更流畅&lt;/td&gt;
&lt;td&gt;易出现撕裂和卡顿&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/details&gt;
&lt;h2 id="question-subjective-13fa8706221f"&gt;10. 在布局（Layout）和绘制（Paint）阶段，浏览器如何避免不必要的重排（Reflow）和重绘（Repaint）&lt;/h2&gt;
&lt;h3 id="题目要点-9"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;明确重排与重绘的区别和性能影响&lt;br&gt;&lt;/li&gt;
&lt;li&gt;介绍浏览器批量更新、延迟计算和图层合成机制&lt;br&gt;&lt;/li&gt;
&lt;li&gt;结合实例说明如何避免强制同步布局&lt;br&gt;&lt;/li&gt;
&lt;li&gt;总结开发中避免不必要重排重绘的具体技巧和建议&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点-1"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解重排和重绘的区别及性能影响"&gt;● 理解重排和重绘的区别及性能影响&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察对浏览器渲染优化关键环节的掌握。&lt;/p&gt;</description></item><item><title>字节-商业化-社招-4年 · 第 1 轮 · 一面</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/round-74/</link><pubDate>Sun, 27 Jul 2025 09:13:11 +0000</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/round-74/</guid><description>&lt;blockquote&gt;
&lt;p&gt;← 已是第一轮 · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/"&gt;返回本次面经&lt;/a&gt; · &lt;a href="https://amatsuzero.github.io/LastStand/posts/frontend/interview-experiences/experience-52/round-75/"&gt;第 1 轮&lt;/a&gt; →&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;本轮要点：&lt;/strong&gt; 全方位解读this、作用域链与闭包、事件循环、call、apply和bind、前端存储、react hooks、react 渲染机制、React函数组件更新&lt;/p&gt;
&lt;p&gt;本轮共 25 道题。答案默认折叠，便于先自行作答。&lt;/p&gt;
&lt;h2 id="question-subjective-6827d12cb118"&gt;1. 讲一下你平常使用的React Hooks&lt;/h2&gt;
&lt;h3 id="题目要点"&gt;题目要点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;熟练掌握常用 Hook（useState/useEffect/useRef/useMemo/useCallback/useContext）&lt;/li&gt;
&lt;li&gt;能结合实际项目说明每个 Hook 的使用动机和实现效果&lt;/li&gt;
&lt;li&gt;理解 Hook 的核心机制（闭包陷阱、依赖数组规则、执行时机等）&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;
&lt;summary&gt;参考答案&lt;/summary&gt;
&lt;h3 id="考察点"&gt;考察点&lt;/h3&gt;
&lt;h4 id="-理解-react-hooks-的基本使用场景及原理"&gt;● 理解 React Hooks 的基本使用场景及原理&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;面试官关注候选人是否掌握了常用 Hook 的使用规范与时机。&lt;/p&gt;
&lt;h4 id="-能否结合项目实际表达-hooks-的应用能力"&gt;● 能否结合项目实际表达 Hooks 的应用能力&lt;br&gt;&lt;/h4&gt;
&lt;p&gt;考察是否具备将 React 函数组件与 Hooks 结合的实际经验与思维能力。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="参考答案"&gt;参考答案&lt;/h3&gt;
&lt;h3 id="一常用-react-hooks-介绍"&gt;一、常用 React Hooks 介绍&lt;/h3&gt;
&lt;h4 id="1-usestate--管理组件内部状态"&gt;1. &lt;code&gt;useState&lt;/code&gt; —— 管理组件内部状态&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;功能&lt;/strong&gt;：定义响应式的本地状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;典型使用场景&lt;/strong&gt;：表单输入值、按钮开关、局部 UI 状态等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; [&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;setCount&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;useState&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h4 id="2-useeffect--副作用逻辑处理"&gt;2. &lt;code&gt;useEffect&lt;/code&gt; —— 副作用逻辑处理&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;：用于处理副作用逻辑，如数据请求、DOM 操作、订阅事件等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;依赖数组决定副作用执行时机&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;常见场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;页面初始化请求数据（空依赖数组）&lt;/li&gt;
&lt;li&gt;监听某个状态变化触发逻辑（依赖项更新）&lt;/li&gt;
&lt;li&gt;组件卸载时清理订阅（返回 cleanup 函数）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;useEffect&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setInterval&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;tick&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, &lt;span style="color:#ae81ff"&gt;1000&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; () =&amp;gt; &lt;span style="color:#a6e22e"&gt;clearInterval&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}, []);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h4 id="3-useref--获取-dom-或存储跨渲染变量"&gt;3. &lt;code&gt;useRef&lt;/code&gt; —— 获取 DOM 或存储跨渲染变量&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;功能&lt;/strong&gt;：可以持久保存可变值而不触发组件重新渲染；或获取 DOM 元素引用。&lt;/p&gt;</description></item></channel></rss>