可通过闭包封装计数器状态与操作方法并暴露重置函数;外层函数定义私有count变量,返回含increment、decrement、getValue和reset方法的对象;每次调用createCounter生成独立实例,支持初始化值及自定义重置值。

可以通过闭包封装计数器的状态和操作方法,同时暴露一个重置函数来清空当前状态。
基础闭包计数器结构
闭包的核心是让内部函数持续访问外部函数作用域中的变量。计数器的状态(如当前数值)放在外层函数中,增减、获取、重置等操作作为返回对象的方法暴露出去。
- 外层函数定义私有变量 count,初始值为 0
- 返回一个对象,包含 increment、decrement、getValue 和 reset 方法
- 所有方法共享同一个 count 变量,形成独立的状态空间
带重置功能的完整实现
下面是一个可复用的工厂函数,每次调用都会生成一个彼此隔离的计数器实例:
function createCounter() {
let count = 0;
return {
increment: () => { count++; },
decrement: () => { count--; },
getValue: () => count,
reset: () => { count = 0; }
};
}
// 使用示例
const counter1 = createCounter();
counter1.increment();
console.log(counter1.getValue()); // 1
counter1.reset();
console.log(counter1.getValue()); // 0
const counter2 = createCounter(); // 独立状态
counter2.increment();
counter2.increment();
console.log(counter2.getValue()); // 2
支持初始化值与自定义重置值
增强灵活性:允许创建时传入初始值,并支持重置为指定值(不只是 0):
- 外层函数接收 initial = 0 参数,作为起始值
- reset 方法接受可选参数 value,不传则重置为 initial
- 内部保留 initialValue 常量,避免被意外修改
function createCounter(initial = 0) {
let count = initial;
const initialValue = initial;
return {
increment: () => count++,
decrement: () => count--,
getValue: () => count,
reset: (value = initialValue) => { count = value; }
};
}
const counter = createCounter(10);
counter.decrement(); // 9
counter.reset(); // 回到 10
counter.reset(100); // 设为 100
注意事项与常见误区
闭包虽简洁,但需注意几个关键点:
- 不要直接暴露 count 变量 —— 否则外部可随意赋值,破坏封装性
- 避免在循环中重复定义闭包函数 —— 如在 for 循环里调用 createCounter,应确保每次调用生成新实例
- 重置逻辑要明确作用域 —— reset 只影响当前闭包内的 count,不影响其他实例
- 若需监听变化,可在方法内添加回调机制,但会增加复杂度,按需扩展
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











