1. React Compiler 在事件处理器内联与闭包捕获的边界条件
React Compiler 如何处理事件处理器中的内联与闭包捕获?其边界条件是什么?
- 事件处理器不参与渲染依赖分析
- 闭包捕获与缓存失效的边界
- 违反规则时的 bailout 行为
React Compiler 分析的是"渲染期间的响应式依赖",事件处理器(onClick 等回调)不在渲染路径上:它们的执行不触发渲染,因此 Compiler 不会为事件处理器内部的读取建立"渲染依赖",也不会对它们做记忆化——这符合 React 语义(事件回调每次渲染重新创建是安全的,缓存反而可能引入过期值)。事件处理器内联闭包捕获的边界:若回调在渲染中创建并被传入子组件,Compiler 会分析其"读取的响应式值"并缓存回调(等价 useCallback,依赖变化才重建),保证引用稳定且值不过期;但若回调读取了"渲染期之外的可变值"(模块级变量、ref.current 之外的非常规读取),Compiler 无法证明其响应性,会谨慎处理或 bailout。
边界条件:Compiler 只信任"符合 Rules of React"的读取(props/state/context 及派生值);事件处理器中读写"不受控可变对象"(如 this 之外的全局单例)会触发 bailout(该组件不记忆化);"捕获最新值"的意图(回调里读 state)Compiler 通过依赖分析自动保证(依赖变化则重建回调),开发者无需 useCallback 包裹——这正是"自动记忆化"对闭包陷阱的消除;若代码在事件处理器中调用"渲染期创建的、读取响应式值的函数",Compiler 也会对其依赖建模。遇到无法分析的模式,Compiler 会跳过优化并给出诊断(不改变行为),开发者可用 'use memo'/'use no memo' 控制。
答题先讲"事件处理器不在渲染依赖路径"的语义基础,再讲回调缓存(依赖变化重建)与"读取非常规可变值触发 bailout"的边界,最后落到 Compiler 对闭包陷阱的自动消除。