模块模式用闭包将业务逻辑封装于独立作用域,仅暴露可控接口;iife适用于单例场景(如日志上报),工厂函数支持多实例隔离,私有变量天然不可访问,兼容所有js环境。

模块模式用闭包把业务逻辑“锁”进一个独立作用域,只留几个可控入口对外服务。它不靠语法关键字实现私有,而是靠函数作用域天然隔离——变量声明在闭包里,没被 return 出去,外部就真的碰不到。
用 IIFE 构建单例业务模板
适合全局唯一、状态轻量的场景,比如统一表单校验规则、通用请求封装、日志上报配置等:
- 把校验规则、默认参数、缓存对象、内部工具函数全写在立即执行函数内
- 所有 let/const/var 声明的内容自动私有,不会泄漏到 window 或 global
- return 的对象只暴露必要方法,如 validate()、setConfig()、log()
- 可在 IIFE 开头做一次性初始化:加载默认字典、绑定公共事件、预设拦截器
用工厂函数支持多实例复用
当业务需要按场景差异化运行(如多个支付通道、不同租户的数据看板、AB 测试分支),必须避免状态混用:
- 把模块写成函数,接收配置参数(如 apiBase、timeout、tenantId)
- 每次调用都生成全新闭包,私有变量(如 cache、retryCount、authToken)完全隔离
- 返回的对象方法仍可安全访问所属闭包内的数据,但无法跨实例读写
- 适合微前端子应用、插件化组件、SDK 多租户集成等场景
暴露接口时守住封装边界
公有方法是唯一入口,所有敏感操作和校验应收在内部,不给外部绕过机会:
- 避免在返回对象中暴露构造函数、工厂方法或原始数据引用(如不要 return { data: privateCache })
- 对入参做类型与范围校验,统一由私有函数处理(如 _validateInput()、_sanitize())
- 异步操作中的中间状态(如 loading、error)也应藏在闭包里,只通过 getter 或回调通知
- 若需销毁资源(定时器、监听器、连接),提供 destroy() 方法并在其中清理闭包内持有的引用
跨环境适配靠契约,不靠平台 API
模块本身不关心运行在哪,只约定“驱动”怎么交、接口怎么调:
- 不直接调 navigator.bluetooth 或 require('fs'),而是定义 setDriver({ connect, read, disconnect })
- 宿主环境按需注入 WebUSB 驱动、uni-app 蓝牙插件、Node.js 串口实例
- 模块只依赖标准 ES5+ 语法,IIFE 兼容所有 JS 引擎(浏览器、小程序、Node.js、uni-app)
- 打包时可加一层 module.exports = 模块名 或 export default,适配不同引入方式











