闭包在工厂函数中创建独立状态,通过返回的内部函数捕获外层变量,使每次调用生成互不干扰的私有数据;如createCounter返回的counterA与counterB各自维护独立count。

闭包在工厂函数中创建独立状态,核心是利用函数作用域和返回的内部函数“捕获”外层变量,使每次调用工厂函数都生成一组互不干扰的私有数据。
工厂函数返回一个闭包,封装私有状态
工厂函数本身不直接暴露状态变量,而是返回一个或多个函数,这些函数在其定义时所处的词法环境中“记住”了外层变量。每次调用工厂函数,都会新建一个作用域,其中的状态彼此隔离。
- 状态变量(如计数器、配置对象)声明在工厂函数内部,而非全局或共享作用域
- 返回的函数通过作用域链访问该变量,形成闭包
- 不同工厂调用产生的闭包,各自持有独立副本,互不影响
典型例子:计数器工厂
下面是一个创建独立计数器的工厂函数:
function createCounter(initial = 0) {
let count = initial; // 私有状态,每个实例独享
return {
increment() { count++; },
decrement() { count--; },
value() { return count; }
};
}
const counterA = createCounter(10);
const counterB = createCounter(100);
counterA.increment();
console.log(counterA.value()); // 11
console.log(counterB.value()); // 100 ← 不受 counterA 影响
这里 count 是闭包中的自由变量,increment、decrement、value 都能访问它,但外部无法直接读写 count,且 counterA 和 counterB 各自维护一份 count。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
进阶用法:带配置和方法的模块化状态
工厂函数可接收参数定制行为,闭包还能封装更复杂的逻辑与状态组合:
function createUserManager(name, maxAttempts = 3) {
let attempts = 0;
const log = (msg) => console.log(`[${name}] ${msg}`);
return {
tryLogin() {
if (attempts
每个返回对象都封闭了自己的 attempts、name 和 maxAttempts,还共享了私有辅助函数 log,体现闭包对状态与行为的统一封装能力。
注意点:避免意外共享引用
如果状态是对象或数组,要小心浅拷贝问题——闭包捕获的是引用,不是值:
- ✅ 正确:用
let obj = { ... }或let arr = []在每次调用中新建 - ❌ 错误:把对象定义在工厂函数外部,或重复赋值同一引用
- 需要深隔离时,可在工厂内用结构化克隆(
structuredClone)或手动复制
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










