闭包包装带状态函数的核心是将状态变量置于外部函数作用域,返回内部函数访问修改——实现私有、持久、隔离的状态管理。

用闭包包装带有状态的函数,核心是把状态变量定义在外部函数作用域中,返回一个内部函数来访问和修改它——这样状态不会暴露给全局,又能在多次调用间持续存在。
基础写法:封装计数器
最典型的例子是创建一个独立、私有的计数器:
function createCounter() {
let count = 0; // 状态变量,仅内部函数可访问
return function() {
count++;
return count;
};
}
const counter1 = createCounter();
console.log(counter1()); // 1
console.log(counter1()); // 2
const counter2 = createCounter();
console.log(counter2()); // 1 —— 独立状态,不影响 counter1
这里 count 是闭包捕获的私有状态,每次调用 createCounter() 都生成一份新副本。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
支持配置与方法的操作对象
如果需要初始化值、重置或读取状态,可以返回一个包含多个方法的对象:
function createStatefulCounter(initial = 0) {
let value = initial;
return {
increment: () => ++value,
decrement: () => --value,
reset: () => { value = initial; return value; },
get: () => value
};
}
const c = createStatefulCounter(10);
console.log(c.get()); // 10
console.log(c.increment()); // 11
console.log(c.reset()); // 10
这种模式更灵活,适合需要多操作的状态管理,且仍保持状态封装性。
避免常见陷阱
-
不要在循环中直接创建闭包引用循环变量(如
for (let i=0; i console.log(i), 100)是安全的;但用var就会输出三个3) - 注意内存泄漏风险:若闭包长期持有大对象或 DOM 引用,且没有清理机制,可能阻碍垃圾回收
- 状态不可被外部直接修改,但可通过暴露的函数控制——这是封装的优势,不是缺陷
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










