javascript函数表达式通过闭包实现单例、模块、工厂函数及惰性初始化四大模式:单例确保唯一实例;模块封装私有成员;工厂函数支持多实例隔离;惰性初始化控制副作用与内存。

JavaScript 中函数表达式常被用作闭包的载体,最典型的设计模式就是单例模式和模块模式。核心不是写个函数,而是利用函数表达式创建独立作用域,把状态和逻辑“锁”在里面,只暴露必要接口。
单例模式:靠闭包缓存唯一实例
关键在于用函数表达式包裹私有变量,确保多次调用返回同一对象引用。
- 用立即执行函数表达式(IIFE)封装构造逻辑,内部用 let/const 声明 instance 变量,仅初始化一次
- 返回一个工厂函数,每次调用都检查并复用已有实例,不新建对象
- 避免直接暴露构造函数或原始数据引用,防止外部篡改内部状态
- 适合配置管理、日志器、请求拦截器等全局唯一服务
模块模式:用闭包组织私有与公有成员
函数表达式返回对象,该对象的方法能访问函数内部的私有变量和辅助函数,但外部无法直接读写。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在函数体内定义私有工具函数(如 _validate()、_format()),不暴露给外部
- 返回对象中只包含明确需要的公有方法,比如 init()、get()、set()
- 初始化逻辑(如加载远程字典、绑定事件)可放在函数开头,只执行一次
- 天然支持“一次准备、多次使用”,尤其适合含异步初始化的场景
工厂函数模式:支持多实例隔离
当需要多个彼此独立的对象时,函数表达式本身不返回单例,而是返回一个可多次调用的工厂函数。
- 工厂函数接收参数(如 tenantId、apiBase),作为实例差异化依据
- 每次调用工厂函数,都会生成全新闭包,私有变量互不干扰
- 返回的每个实例拥有独立状态(如各自的缓存、配置、计数器)
- 适用于微前端子应用、多租户 SDK、AB 测试分支等场景
惰性初始化与副作用控制
函数表达式配合闭包,让初始化时机可控,避免无谓开销。
- 不把实例或模块提前创建,而是在首次调用时才执行耗时操作(如 fetch 配置、解析 schema)
- 将 loading、error 等中间状态藏在闭包里,只通过 getter 或回调通知外部
- 对入参做校验和清洗,统一由私有函数处理,保持公有接口干净
- 避免在闭包中长期持有大对象或 DOM 引用,防止内存泄漏
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










