闭包工厂通过外层函数每次创建独立私有变量和内层函数(或对象),实现作用域隔离与状态封装;支持返回函数或对象形式,需注意对象/数组等引用类型应深拷贝避免共享。

用闭包工厂创建独立作用域实例,核心是让每次调用工厂函数都返回一个新闭包,其中封装了私有变量和专属函数,彼此互不干扰。
闭包工厂的基本写法
工厂函数本身是一个外层函数,它定义局部变量,并返回一个内层函数(或对象),该内层函数引用了外层的变量——这就形成了闭包。每次调用工厂函数,都会新建一套局部变量,从而实现作用域隔离。
- 外层函数负责“初始化私有状态”
- 返回的函数(或对象方法)负责“访问和操作该状态”
- 多次调用工厂,得到多个相互独立的闭包实例
返回函数形式的闭包实例
适合需要统一接口、轻量级行为封装的场景:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function createCounter(initial = 0) {
let count = initial; // 每次调用都新建的私有变量
return function(action) {
if (action === 'inc') count++;
else if (action === 'dec') count--;
else if (action === 'get') return count;
};
}
const counter1 = createCounter(10);
const counter2 = createCounter(100);
console.log(counter1('get')); // 10
console.log(counter2('get')); // 100
counter1('inc');
console.log(counter1('get')); // 11
console.log(counter2('get')); // 100 —— 不受影响
返回对象形式的闭包实例
更常见,便于暴露多个方法,同时保持私有状态隐藏:
立即学习“Java免费学习笔记(深入)”;
function createUser(name, age) {
// 私有数据,外部不可直接访问
let _name = name;
let _age = age;
return {
getName() { return _name; },
getAge() { return _age; },
setAge(newAge) {
if (newAge > 0) _age = newAge;
},
introduce() {
return `I'm ${_name} and ${_age} years old.`;
}
};
}
const userA = createUser('Alice', 25);
const userB = createUser('Bob', 30);
console.log(userA.introduce()); // "I'm Alice and 25 years old."
console.log(userB.introduce()); // "I'm Bob and 30 years old."
userA.setAge(26);
console.log(userA.getAge()); // 26
console.log(userB.getAge()); // 30 —— 独立变更
注意点:避免意外共享引用
如果私有变量是对象或数组,要小心浅拷贝问题。需在工厂内部重新创建副本,否则多个实例可能共用同一引用:
- ❌ 错误:把外部对象直接赋给私有变量(导致共享)
- ✅ 正确:用 structuredClone、展开语法或构造函数新建实例
function createCart(items = []) {
// ✅ 每次都新建数组,避免实例间污染
const _items = [...items];
return {
addItem(item) { _items.push(item); },
getItems() { return [..._items]; }, // 返回副本,保护内部
};
}

















