javascript中用闭包实现工厂函数计数器的核心是每次调用工厂函数都返回一个独立的、带私有状态的计数器函数,通过闭包捕获并保存局部变量count,确保各实例状态隔离。

JavaScript 中用闭包实现工厂函数的计数器,核心是让每次调用工厂函数都返回一个独立的、带有私有状态的计数器函数。闭包捕获并保存了内部变量(如 count),外部无法直接访问,但返回的函数可以持续读写它。
基本写法:返回带状态的计数函数
工厂函数本身不维护状态,而是每次执行时创建新的词法环境,其中的局部变量被内部函数闭包持有:
function createCounter() {
let count = 0;
return function() {
count++;
return count;
};
}
const counter1 = createCounter();
const counter2 = createCounter();
console.log(counter1()); // 1
console.log(counter1()); // 2
console.log(counter2()); // 1 —— 独立于 counter1
支持初始化值和自定义步长
增强工厂函数的灵活性,通过参数控制起始值和每次递增的量:
function createCounter(start = 0, step = 1) {
let count = start;
return function() {
const current = count;
count += step;
return current;
};
}
const counterA = createCounter(10, 2);
const counterB = createCounter(100);
console.log(counterA()); // 10
console.log(counterA()); // 12
console.log(counterB()); // 100
提供重置和获取当前值的方法
返回一个对象,暴露多个操作接口,同时保持 count 的私有性:
function createCounter(initial = 0) {
let count = initial;
return {
increment() {
count++;
return count;
},
decrement() {
count--;
return count;
},
value() {
return count;
},
reset() {
count = initial;
return count;
}
};
}
const c = createCounter(5);
console.log(c.value()); // 5
console.log(c.increment()); // 6
console.log(c.decrement()); // 5
console.log(c.reset()); // 5
注意点:避免意外共享状态
常见错误是把变量声明在工厂函数外,导致所有实例共用同一份数据:
// ❌ 错误:count 是全局/外层变量,所有计数器共享
let count = 0;
function badCreateCounter() {
return function() {
return ++count; // 所有调用都操作同一个 count
};
}
✅ 正确做法:确保 let count 在工厂函数**每次调用的局部作用域内声明**,这样每个返回的函数都闭包各自独立的 count。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











