闭包计数器通过外层函数返回内层函数,使内层函数持续访问并修改外层变量count,实现状态保持与封装;支持初始化值、步长及重置等方法,各实例独立互不影响。

用闭包实现计数器,核心是让内部函数“记住”并持续操作外部函数的变量,同时避免该变量被外部直接访问或修改。
基本闭包计数器写法
定义一个外层函数(比如 createCounter),它返回一个内层函数;内层函数访问并修改外层函数中定义的局部变量(如 count),这个变量不会被垃圾回收,从而维持状态。
示例:
function createCounter() {
let count = 0;
return function() {
count++;
return count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
支持初始化值和自定义步长
让计数器更灵活,可以在创建时传入起始值和每次增加的量:
function createCounter(start = 0, step = 1) {
let count = start;
return function() {
const current = count;
count += step;
return current;
};
}
const counter1 = createCounter(10, 2);
console.log(counter1()); // 10
console.log(counter1()); // 12
console.log(counter1()); // 14
提供重置、获取当前值等控制方法
返回一个对象,包含多个方法,统一管理同一个闭包内的状态:
function createCounter(start = 0) {
let count = start;
return {
increment: () => ++count,
decrement: () => --count,
value: () => count,
reset: () => { count = start; return count; }
};
}
const counter = createCounter(5);
console.log(counter.value()); // 5
console.log(counter.increment()); // 6
console.log(counter.decrement()); // 5
console.log(counter.reset()); // 5
注意点:每个闭包实例相互独立
每次调用 createCounter() 都会生成一组全新的私有变量,不同实例之间互不影响:
- counterA 和 counterB 各自维护自己的 count
- 无法从外部读取或修改它们的内部值,保证了封装性
- 适合需要多个独立计数场景,比如多个按钮点击统计











