闭包通过iife实现模块一次性私有初始化,集中执行配置加载、资源预取等操作并封装状态;工厂函数支持多实例差异化初始化,私有工具函数提升内聚性与安全性。

闭包让模块在创建时执行一次初始化逻辑,且该逻辑完全私有——外部既看不到过程,也无法重复触发或干扰。
在IIFE开头集中执行初始化
把配置加载、资源预取、事件绑定等一次性操作,放在IIFE函数体最上方。这些代码随模块定义立即运行,且只执行一次:
- 声明私有变量(如
let config、const cache = new Map())后立刻赋值或初始化 - 调用内部辅助函数完成校验、解析或异步准备(如
loadDefaultConfig()) - 绑定全局事件或监听器时,用模块内私有函数作回调,避免污染外部作用域
初始化结果不暴露,只保留副作用
初始化产生的状态(如token、连接实例、默认值)应存为私有变量,不返回、不挂到接口对象上:
- ✅ 正确:
let client = new ApiClient(options)—— 仅模块内方法能调用client.request() - ❌ 错误:
client: client或rawClient: client—— 破坏封装,外部可绕过模块逻辑直接操作 - 若需验证初始化是否成功,可暴露
isReady()这类只读判断方法,不泄露内部细节
用工厂函数支持带参的差异化初始化
当模块需要多个实例、每个实例初始化参数不同时,改用工厂函数代替IIFE:
- 每次调用
createModule({ timeout: 5000, endpoint: '/v2' })都生成全新闭包环境 - 参数在函数入口解构并立即用于初始化(如
const controller = new AbortController()) - 私有初始化逻辑可包含条件分支:比如根据
env === 'dev'决定是否开启日志
初始化中嵌入私有工具函数
把校验、格式化、签名等辅助逻辑写在初始化区域下方,它们天然私有且仅模块内可用:
- 例如定义
function validateInput(data) { ... },随后在submit()方法中调用 - 这些函数不占用返回对象的属性名,不会被遍历、重写或意外覆盖
- 初始化阶段还可预先填充缓存、建立映射表,提升后续调用性能











