前端面试 P074:函数组件快照与类实例的输出纠错
来源:方格前端讲面试 · 4.函数组件和类组件的本质区别是什么?,14 分 01 秒。
回看定位:00:27 两种模型 · 06:16 函数示例 · 08:54 副作用组织
持久实例与每次渲染绑定
类组件通常在实例上保存 props/state,延迟回调执行时若读取 this.state,会读那时实例上的值。函数组件每次渲染有一组绑定,回调闭包关联该次渲染,不会因 setter 调用就原地改变 count 变量。
必须纠正课件的 1、2、3
视频函数组件初始 useState(0),处理器先 setCount(count + 1),再调用安排定时读取 count 的 logMessage。三次独立点击且每次完成相应渲染后,闭包分别属于 count 为 0、1、2 的处理器,输出应为 0、1、2,不是视频标注的 1、2、3。
function Counter() {
const [count, setCount] = React.useState(0);
function handleClick() {
setCount(count + 1);
setTimeout(() => console.log(count), 1000);
}
return <button onClick={handleClick}>{count}</button>;
}
如果目标是记录本次更新请求的新数值,可以先计算 const next = count + 1,setter 和日志都明确使用 next。若目标是定时器运行时最新状态,则需考虑 ref 或其他合适结构,不能含混称为同一种需求。
“快照”不是深冻结
闭包保留词法绑定,绑定指向的对象如果被违规原地修改,仍可能观察到变化;React 不会自动深克隆所有对象。类组件也可先捕获局部 const 来获得特定时间点的值,不能说类永远不能快照。
函数组件与 Hooks 常用于现代代码,类仍可用于维护现有代码和某些错误边界等场景。Effect 按外部同步关系组织,不能简单当成生命周期函数的一对一替换。