hook 与闭包
一句话结论:函数组件每次 render 都会创建新的闭包;如果你把旧闭包里的值“带到未来”,就会遇到 stale state/过期 props 等问题。
1. 闭包陷阱长什么样
- Effect/回调捕获了旧 state
- 异步回调执行时读到的是旧值,而不是最新值
2. 常见解决手段
- 函数式更新:
setState((prev) => next(prev))避免依赖外部闭包值 useRef保存最新值:在回调里读ref.current- 正确写依赖数组:让 effect 在依赖变化时重新注册
3. 面试要点
- “闭包不是 bug,是 JS 语义”;关键在于你是否意识到 render 是重新执行函数
- 并发渲染下更要避免“读写不一致”,必要时用
useSyncExternalStore