闭包中多个内部函数共享变量的本质是作用域链复用,即同一次外层函数调用中定义的函数共用该次调用的局部变量内存;var在循环中导致所有闭包共享同一变量,let则每轮迭代新建绑定;React函数组件中同一次渲染的事件处理函数也闭包捕获当次state/props。

多个内部函数共享同一份变量,本质就是闭包的“作用域链复用”——它们都绑定在同一个外层函数执行上下文中,自然共用其中的局部变量。这不是额外技巧,而是 JavaScript 词法作用域的默认行为。
共享变量的核心条件
只要多个内部函数是在**同一次外层函数调用中被定义**,且都引用了该次调用中声明的同一个变量(无论用 let、const 还是 var),它们就自动共享该变量。
- 每次调用外层函数,都会创建一个独立的作用域实例
- 该次调用中定义的所有内部函数,都指向这个实例里的变量内存位置
- 变量不是拷贝,是真实引用;读写都是操作同一块内存
典型写法:返回对象或解构函数
最常用也最清晰的方式,是让外层函数返回一个包含多个方法的对象,这些方法天然共享闭包变量:
function createCounter() {
let count = 0;
return {
increment: () => ++count,
decrement: () => --count,
get: () => count,
reset: () => { count = 0; }
};
}
const counter = createCounter();
counter.increment(); // 1
counter.increment(); // 2
console.log(counter.get()); // 2
counter.decrement(); // 1
这里 increment、decrement、get、reset 四个函数,都在 createCounter 的一次调用中诞生,共用同一个 count。
立即学习“Java免费学习笔记(深入)”;
注意 var 和 let 在循环中的差异
如果在循环里生成多个闭包函数,var 会导致所有函数共享一个变量,而 let 每轮迭代新建绑定——这直接影响是否“统一状态”:
- var i:4 个函数都读取最终的 i === 4,状态完全统一但不是你想要的
- let i:每轮生成独立的 i,4 个函数各持一份,不共享
- 若真要统一状态,应把变量提到循环外,再让所有函数引用它
React 中的对应现象
在函数组件的一次渲染中,所有事件处理函数(如 onClick、onChange)都闭包捕获了该次渲染时的 state 和 props 值。它们不跨渲染共享,但在本次渲染内是严格一致的——这就是为什么多次点击按钮不会“看到”中间 state 变化,因为它们都锁定在初始值上。
要突破这种“静态快照”,可用 useRef 存储可变值,或用函数式更新 setState(prev => ...) 避免依赖闭包捕获的旧值。


















