You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React:Hooks函数的局部变量为何能在回调中被访问?

为什么React函数组件的回调能访问已销毁的局部变量?

先看你给出的Hook示例:

function App() {
  let [counter, setCounter] = useState(0);
  return <button onClick={() => setCounter(counter + 1)}>{counter}</button>;
}

你提到的疑问核心,本质是**闭包(Closure)**的特性在起作用,和JavaScript的词法作用域、垃圾回收机制直接相关:

  • 当React第一次调用App()时,会创建一个执行上下文,里面包含当前的counter(初始值为0)和setCounter(useState返回的状态更新函数)。
  • 你定义的onClick箭头函数,会捕获这个执行上下文对应的词法环境——简单说就是,这个回调会记住自己被创建时所在的变量环境,哪怕外层的App函数执行完弹出调用栈,只要这个回调还被引用着,它捕获的词法环境就不会被垃圾回收机制清理。
  • 这里的回调被React绑定到了真实DOM按钮的点击事件上,只要按钮还在页面上,这个回调就一直存在,自然能访问到当初捕获的counter和setCounter。

另外补充一点:每次点击按钮调用setCounter后,React会重新执行App()生成新的组件渲染内容,这时候会生成新的counter、setCounter,以及新的回调函数——这个新回调捕获的是新的词法环境里的变量,所以你点击后看到的是更新后的数值,这也是为什么每次更新后回调能拿到最新的状态值。

内容的提问来源于stack exchange,提问作者lch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:01:12