闭包是模块模式管理业务状态的底层支撑,通过函数作用域天然锁住变量实现状态私有化;iife构建单例沙箱适用于全局唯一轻量场景,工厂函数支持多实例隔离,暴露接口需守住边界,且须主动管理状态生命周期防泄漏。

闭包是模块模式管理业务状态的底层支撑——它不靠语法限制,而是用函数作用域天然锁住变量,让状态只对模块内部方法可见、可变,外部既读不到也改不了。
用 IIFE 构建单例状态沙箱
适合全局唯一、轻量级的状态管理场景,比如统一配置、日志缓存、表单校验规则等:
- 把状态变量(如 _cache、_config、_retryCount)和辅助函数(如 _validate()、_format())全写在立即执行函数内
- 所有 let/const/var 声明的内容自动私有,不会泄漏到 window 或 global
- 只通过 return 暴露必要方法,例如 setConfig()、submit()、log()
- 可在 IIFE 开头做一次性初始化:加载默认字典、预设拦截器、绑定公共事件监听
用工厂函数支持多实例状态隔离
当业务需要多个独立运行的模块(如不同租户的数据看板、多个支付通道、AB 测试分支),必须避免状态混用:
- 把模块写成函数,接收差异化参数(如 tenantId、apiBase、timeout)
- 每次调用都生成全新闭包,私有变量(如 _authToken、_pendingRequests)完全独立
- 返回的方法仍能安全访问所属闭包内的数据,但无法跨实例读写或干扰
- 适用于微前端子应用、插件化组件、SDK 多租户集成等场景
暴露接口时守住状态边界
公有方法是唯一入口,所有敏感操作和中间状态必须收在闭包里,不能给外部绕过机会:
- 避免返回原始数据引用(如不要 return { data: _privateCache }),防止外部直接修改
- 对入参做类型与范围校验,统一交由私有函数处理(如 _sanitizeInput()、_checkAuth())
- 异步中间态(如 loading、error)藏在闭包中,只通过 getter 或回调通知
- 提供 destroy() 方法,在其中清理定时器、事件监听、连接等持有的闭包引用
状态生命周期要主动管理
闭包让状态驻留内存,但不会自动释放——长期运行的应用需明确控制其存续:
- 每个模块实例的状态,会随闭包引用存在而持续保留在内存中
- 未调用 destroy() 的定时器、未解绑的事件监听,可能造成内存泄漏
- 热更新场景下,旧闭包需在 dispose 中彻底清理,新闭包在 accept 中重建状态
- 调试时可在 Chrome DevTools 的 Closure 面板查看实际持有的变量,而非靠 console.log 猜测











