闭包本身不直接实现懒加载,但它为懒加载提供状态隔离与延迟执行能力;需结合闭包封装与显式触发机制(如方法调用、事件监听)完成按需初始化,支持单例、多实例及交互驱动等场景,并需注意资源释放。

闭包本身不直接实现懒加载,但它为懒加载提供了关键基础——状态隔离与延迟执行能力。真正的懒加载需要结合闭包封装 + 显式触发机制(如方法调用、事件监听或条件判断)来完成。核心思路是:把模块的初始化逻辑藏在闭包内,只在首次真正需要时才执行,之后复用结果。
用闭包封装“按需初始化”的单例模块
适合日志、上报、配置管理等全局轻量服务。闭包内部维护一个私有实例变量,仅在第一次调用 getInstance 或 init 时创建:
- 声明 let instance = null 在闭包作用域中,外部不可见
- 暴露的方法(如
getInstance())检查 instance 是否为空,为空则调用工厂函数创建 - 后续调用直接返回已创建的实例,避免重复初始化
- 可进一步支持异步初始化(如等待远程配置),只需缓存 Promise 而非实例
闭包 + 工厂函数支持多实例懒加载
适用于需要多个独立 SDK 实例的场景(如多租户推送、不同环境日志通道):
- 不直接返回单例,而是返回一个工厂函数(如
createSDK(options)) - 每次调用工厂函数,都在新闭包中生成隔离的状态(client、token、配置等)
- 工厂内部仍可做懒初始化:比如 client 实际在第一次 trackEvent 时才 new
- 实例之间完全解耦,互不影响
闭包配合自定义事件实现交互驱动懒加载
当模块加载由用户行为触发(如点击编辑按钮、展开高级设置)时,闭包可用于封装加载逻辑和缓存结果:
- 在闭包中用 Map 或对象缓存已加载的模块(
loadedModules.set('editor', module)) - 监听自定义事件(如
document.addEventListener('load-editor', handler)) - handler 中调用
import('./Editor.js'),成功后存入缓存并执行module.init(detail) - 后续相同事件直接从缓存取模块,跳过网络请求
注意闭包带来的资源管理细节
懒加载不是“只管加载、不管释放”,闭包持有了状态引用,容易导致内存滞留:
- 如果模块支持销毁(如卸载编辑器、断开推送连接),需在闭包内暴露
destroy()方法清理副作用 - 避免在闭包中长期持有 DOM 引用或未解绑的事件监听器
- 对大型模块,考虑加载后是否允许主动清空缓存(如用户退出某功能页时)











