函数工厂模式是利用闭包捕获并持久化外部变量,返回行为定制化、状态隔离函数的模式;它接收配置参数并返回能记住创建时参数的闭包函数,轻量且契合函数式编程,常用于日志封装、事件处理器绑定和api适配器等场景。

函数工厂模式是闭包最典型、最实用的应用之一。它利用闭包捕获并持久化外部作用域的变量,让每次调用工厂函数都能生成行为定制化、状态隔离的新函数。
什么是函数工厂模式
函数工厂不是类或构造函数,而是一个返回函数的函数。它接收配置参数(如默认值、主题、平台标识等),内部定义并返回一个闭包函数——该函数能记住创建时的参数,后续调用无需重复传入。
和面向对象的“工厂类”不同,函数工厂轻量、无实例开销,天然契合 JavaScript 的函数式特性。
常见应用场景
带默认配置的工具函数
例如封装一个带固定前缀的日志函数:
- const logger = createLogger('【支付模块】');
logger('订单提交成功'); // 输出:【支付模块】订单提交成功 - 内部通过闭包保存 prefix,避免每次调用都拼接字符串
事件处理器的预设绑定
避免在循环中使用 var 声明导致的闭包陷阱:
- buttons.forEach((btn, i) => {
btn.addEventListener('click', createHandler(i));
});
function createHandler(index) { return () => console.log(`点击了第 ${index + 1} 个按钮`); } - 每个 handler 独立封闭自己的 index,不依赖外部变量生命周期
API 请求适配器
为不同环境生成专属请求函数:
- const devApi = createApi({ baseUrl: '/mock' });
const prodApi = createApi({ baseUrl: 'https://api.example.com' }); - 两个函数共享相同逻辑,但各自封闭了 baseUrl 和拦截规则
为什么必须用闭包
如果不依赖闭包,就只能把配置作为参数反复传入:
- ❌ logger('【支付模块】', '订单提交成功') —— 每次调用都要传前缀
- ✅ const logger = createLogger('【支付模块】'); logger('订单提交成功') —— 配置只设一次,靠闭包记住
闭包让“配置一次、复用多次”成为可能,同时保证各实例间状态互不干扰。这也是它比全局变量或对象属性更安全、更可预测的原因。
本质上,函数工厂模式是闭包能力的一次精准落地:用最少的语法,实现高内聚、低耦合的行为封装。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











