JavaScript工厂模式结合闭包本质是利用函数作用域封装状态,返回带记忆能力的可复用函数;它不创建对象实例,而是通过闭包固化配置,生成无副作用、输入决定输出的纯函数,天然适配柯里化与组合。

JavaScript 中的工厂模式结合闭包,本质是利用函数作用域封装状态,返回具备特定行为的新函数——它不创建对象实例,而是生成可复用、带记忆能力的函数实例。
闭包让工厂函数“记住”配置
工厂函数执行时形成私有作用域,内部变量被返回的函数持续引用,实现配置固化。比如创建不同精度的四舍五入函数:
const createRounder = (decimalPlaces) => {
const multiplier = Math.pow(10, decimalPlaces);
return (num) => Math.round(num * multiplier) / multiplier;
};
<p>const round2 = createRounder(2); // 记住 decimalPlaces = 2
const round0 = createRounder(0); // 记住 decimalPlaces = 0</p><p>round2(3.14159); // 3.14
round0(3.14159); // 3
每次调用 createRounder 都产生独立闭包,互不影响。
工厂返回纯函数,符合函数式核心原则
生成的函数无副作用、输入决定输出、不修改外部状态。关键点包括:
立即学习“Java免费学习笔记(深入)”;
- 工厂本身不保存共享状态,避免意外耦合
- 返回函数只依赖闭包内捕获的值,不读取全局或外部变量
- 可安全用于 map、filter 等高阶函数中
组合与柯里化天然适配闭包工厂
闭包工厂容易嵌套或链式使用,支撑函数组合。例如创建带默认前缀的日志函数:
const createLogger = (prefix) => (level, msg) =>
console[level](`[${prefix}] ${msg}`);
<p>const apiLogger = createLogger('API');
apiLogger('warn', 'timeout'); // [API] timeout
这种写法既是工厂,也是柯里化,还能进一步组合:
const withTimestamp = (logger) => (level, msg) =>
logger(level, `${new Date().toISOString()} ${msg}`);
<p>const timedApiLogger = withTimestamp(apiLogger);
注意内存与重用边界
闭包保持变量存活,需警惕长期驻留的引用:
- 避免在工厂中捕获大型对象或 DOM 节点
- 若配置极少变化,可缓存工厂结果,而非反复调用工厂
- 测试时确保每个工厂调用生成独立行为,不因共享闭包导致测试污染



















