闭包是模块模式实现逻辑隔离的底层机制,它靠函数作用域天然形成的词法环境边界隔离私有状态,变量未挂载到返回对象时外部无法读取、修改或遍历;IIFE是最简稳的私有沙箱,工厂函数支持多实例隔离,模块封装状态、行为与初始化逻辑。

闭包是模块模式实现逻辑隔离的底层机制,它不靠命名约定或访问修饰符,而是靠函数作用域天然形成的词法环境边界。只要变量和函数声明在闭包内部、不挂到返回对象上,外部就既读不到、也改不了、更遍历不出来。
私有状态靠作用域,不是靠命名
模块里的“私有”不是把变量起名 _count 或加注释说“请勿修改”,而是让它根本不出现在模块对象的属性链里:
-
console.log(module._count) 返回
undefined,因为这个属性压根不存在 - for...in 遍历模块对象,看不到任何私有变量
- 调试时只能在 Chrome DevTools 的 Closure 面板里展开查看,无法通过 window 或全局上下文触达
IIFE 是最简稳的私有沙箱
用立即执行函数表达式包裹全部逻辑,是最经典且全环境兼容(浏览器、Node.js、小程序)的做法:
- 所有 let/const/var 声明的变量、辅助函数,仅在该函数内可见
- 只通过 return 显式暴露一个对象,作为唯一对外接口
- 返回对象上的方法因处于闭包中,能自由访问内部变量,但外部无法绕过它直接操作
多实例靠工厂函数,不是单例复用
当需要多个相互独立的模块(比如不同表单的校验器、多个账号的 SDK 实例),不能共用一份私有状态:
- 每次调用工厂函数,都会生成一组全新的闭包环境
- 每个实例的私有变量(如 token、cache、counter)完全隔离
- 可传入差异化配置,各实例按需初始化,互不影响
模块封装的是状态 + 行为 + 初始化契约
模块不只是存数据的容器,它把初始化、工具逻辑、对外接口打包成一个自洽单元:
- 可在 IIFE 开头做一次性设置:加载默认配置、预绑定事件、初始化驱动
- 定义仅内部调用的辅助函数,比如参数校验、签名计算、数据脱敏
- 对外方法只负责流程调度,敏感逻辑和校验都收在私有层
- 跨环境适配靠接口契约:模块不自己调硬件 API,而是接收符合约定的驱动对象

















