工厂模式用闭包生成独立实例,每次调用创建新词法作用域,使私有变量(如count、hp)隔离不共享;状态必须定义在工厂函数内,返回方法自动捕获对应闭包数据,支持参数化定制并隐藏实现细节。

JavaScript 中工厂模式用闭包生成独立实例,关键是每次调用工厂函数时,都创建一个全新的词法作用域——这个作用域里的变量和函数被返回的方法“记住”,形成专属闭包,彼此隔离。
每次调用都新建一套私有状态
工厂函数内部声明的变量(如 count、hp、email)属于局部作用域。每次执行工厂函数,JS 引擎都会分配一份新内存,因此不同实例的私有数据完全不共享。
- 写法上必须把状态变量定义在工厂函数体内,不能提到外层作用域
- 例如
let value = 0放在createCounter()内部,而不是函数外 - 两个
const a = createCounter()和const b = createCounter()各自拥有自己的 value
返回对象方法自动绑定当前闭包
返回的对象方法(如 increment()、getName())在定义时就捕获了所在闭包中的变量。它们不依赖 this,也不需要 .bind() 或箭头函数“修复”上下文。
-
increment()总是操作它诞生时那个闭包里的 count - 即使把方法赋给新变量或传入
setTimeout,依然能正确读写原始闭包数据 - 事件回调(如
mousemove处理函数)可直接访问闭包中的 scaleFactor、panOffset
适合封装复杂配置与行为逻辑
闭包工厂天然支持参数化定制,同时隐藏实现细节。比如汽车工厂接收 engineType 和 color,返回的构造函数只暴露 drive() 接口,内部状态对外不可见。
立即学习“Java免费学习笔记(深入)”;
- 配置项(如主题色、API 基地址)可在工厂调用时传入,固化到闭包中
- 辅助函数(验证、格式化、缓存计算)定义在内部,仅供公有方法调用
- 外部只能通过约定接口操作,无法绕过逻辑直接修改原始数据
避免常见陷阱:别让状态“逃出”闭包
一旦状态变量脱离工厂函数作用域,多个实例就会意外共享,失去独立性。
- ❌ 错误:把
let sharedCount = 0放在工厂函数外,所有实例共用它 - ❌ 错误:用
this绑定对象属性,导致不同实例仍可能互相干扰 - ✅ 正确:所有关键状态都声明在工厂函数内,仅通过返回方法间接访问


















