闭包可保存计数状态,使函数调用次数持久化:外层函数初始化count变量并返回内层函数或对象方法,共享同一闭包环境,避免全局变量污染;支持基础计数、增强版重置与读取、以及绑定任意函数的高阶封装。

可以通过闭包保存计数状态,让每次调用函数时自动更新并返回当前执行次数。
闭包封装计数器
定义一个外层函数,内部声明计数变量,返回一个内层函数。内层函数每次执行时递增并返回该变量——由于闭包特性,变量不会被回收,状态得以持久保留。
- 外层函数只执行一次,初始化计数器
- 返回的函数可被多次调用,共享同一份闭包环境
- 避免使用全局变量,防止污染和意外修改
基础实现示例
下面是一个统计某函数被调用了几次的典型写法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function createCounter() {
let count = 0;
return function() {
count++;
console.log(`已执行 ${count} 次`);
};
}
const myFunc = createCounter();
myFunc(); // 已执行 1 次
myFunc(); // 已执行 2 次
myFunc(); // 已执行 3 次
支持重置与读取的增强版本
实际使用中常需查看当前次数或重置计数,可在返回对象中暴露多个方法:
立即学习“Java免费学习笔记(深入)”;
- 用对象返回 execute、getCount 和 reset 方法
- 所有方法共享同一个闭包中的 count 变量
- 保持封装性,外部无法直接访问或修改 count
function createCounter() {
let count = 0;
return {
execute() {
count++;
console.log(`执行第 ${count} 次`);
},
getCount() {
return count;
},
reset() {
count = 0;
}
};
}
const counter = createCounter();
counter.execute(); // 执行第 1 次
counter.execute(); // 执行第 2 次
console.log(counter.getCount()); // 2
counter.reset();
console.log(counter.getCount()); // 0
绑定到具体函数的实用封装
若想为任意已有函数添加调用计数能力,可做一个高阶函数:
- 接收目标函数作为参数,返回一个带计数功能的新函数
- 新函数执行时先计数,再调用原函数,并透传参数和返回值
- 同时暴露 getCount 方法供外部查询
function countCalls(fn) {
let count = 0;
const countedFn = function(...args) {
count++;
return fn.apply(this, args);
};
countedFn.getCount = () => count;
return countedFn;
}
const sayHello = countCalls(() => console.log("Hello"));
sayHello(); // Hello
sayHello(); // Hello
console.log(sayHello.getCount()); // 2

















