闭包通过函数作用域隔离实现模块私有状态封装:将变量声明于IIFE内,仅暴露操作方法;返回对象定义清晰接口,支持配置初始化与多实例独立;注意this绑定与异步时机,确保状态可用。

用闭包隐藏模块内部状态、只暴露必要接口,核心是靠函数作用域的天然隔离性:内部变量和函数对外不可见,仅通过返回对象中的方法间接访问。
用立即执行函数封装私有边界
把模块逻辑写在一个立即执行函数(IIFE)里,所有需要隐藏的状态(如计数器、配置、缓存)都声明在函数体内。这些变量不会挂到全局,也不会被外部直接读写。
- 不写 var count = 0 在全局或模块外,而是写在 IIFE 内部
- 返回的对象里不包含 count 本身,只放能操作它的方法
- 即使返回的对象被多次引用,只要没暴露变量引用,私有状态就始终安全
返回对象定义清晰的公共契约
返回的对象就是对外接口,它的每个属性名是你向使用者承诺的能力,不是实现细节的映射。
- 行为类方法用动词开头:save、reset、validate
- 状态类属性用形容词或名词:isReady、version、defaults
- 避免暴露中间状态,比如不用 getInternalCache,而用 hasCached 或 clearCache
支持配置初始化,提升复用性
硬编码初始值会让模块僵化。把配置作为参数传入闭包,在内部完成初始化,让同一份代码适配不同场景。
立即学习“Java免费学习笔记(深入)”;
- 例如 Logger 模块接收 { level: 'warn', enabled: true },内部据此设定闭包变量
- 配置项要有合理默认值:config.level || 'info'
- 每次调用工厂函数都会生成独立闭包环境,多个实例互不干扰
注意 this 和异步时机问题
暴露的方法如果被当回调使用(比如传给 addEventListener),原始上下文容易丢失;异步操作完成前,数据可能还没就绪。
- 对需要保持上下文的方法,可在返回对象中预绑定:log: (msg) => console.log(msg)
- 异步场景下,不要让 getData() 立刻返回未就绪的数据,而应返回 Promise 或配合回调机制
- 确保外部拿到的是已初始化完成、状态可用的模块实例


















