闭包实现计数器的核心是内部函数持续访问并修改外部函数的局部变量以保持状态。基本写法为外层函数声明count并返回自增内层函数;可扩展支持初始化值和步长;还可返回含increment、decrement等方法的对象;需避免循环中闭包共享变量等误区。

用闭包实现计数器,核心是让内部函数“记住”并持续操作外部函数作用域中的变量,从而保持状态不被重置。
基本写法:返回一个自增函数
定义一个外层函数(比如 createCounter),它声明一个局部变量(如 count),再返回一个内层函数。这个内层函数每次调用都读取并修改 count,由于闭包存在,count 不会随外层函数执行结束而销毁。
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
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
支持初始化值和自定义步长
让计数器更灵活,可以给外层函数加参数,把初始值和步长也封闭进去。
- init 控制起始数字
- step 控制每次增加多少
- 内层函数仍只负责更新并返回当前值
function createCounter(init = 0, step = 1) {
let count = init;
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(init = 0) {
let count = init;
return {
increment: () => ++count,
decrement: () => --count,
value: () => count,
reset: () => { count = init; 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
注意避免常见误区
- 不要在循环中直接创建多个闭包却共用同一个变量(比如用 var 声明的循环变量)——容易所有函数都引用到最后的值
- 如果要生成多个独立计数器,每次都要调用外层函数(如 createCounter()),确保每个都有自己的 count 副本
- 闭包会持续持有对外部变量的引用,长期不用时可手动解除(如将返回的函数设为 null),防止内存泄漏(一般简单计数器无需特别处理)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










