模块模式通过闭包封装私有常量,使其仅存在于函数作用域内,外部不可读写;iife适用于单例常量集,工厂函数适配多组独立配置,并支持常量与行为(如getendpoint)一并封装。

模块模式用闭包封装私有常量,核心是让常量只存在于函数作用域内,外部既不能改、也不能直接读——不是靠命名约定(比如加下划线),而是靠作用域天然屏蔽。
私有常量必须声明在闭包内部
只要用 let、const 或 var 在 IIFE 或工厂函数里定义,它就自动成为私有常量。不挂到返回对象上,外部连属性名都找不到。
-
✅ 正确写法:
const API_VERSION = "v2";写在 IIFE 里面,没被 return 出去 -
❌ 错误写法: 把
{ API_VERSION }直接放进返回对象,那就成了可读可改的公有属性 - 调试时只能在 Chrome DevTools 的 Closure 面板里看到它,
console.log(module.API_VERSION)会是undefined
IIFE 适合单例常量集
全局唯一、不随实例变化的常量,比如 SDK 版本号、默认超时时间、环境标识,用立即执行函数最稳妥。
- 初始化逻辑可一次性执行:读取 localStorage 默认配置、校验环境变量
- 所有方法共享同一份常量,节省内存
- 兼容性好,从 IE11 到小程序、uni-app 全支持
工厂函数适配多组常量配置
当不同业务场景需要各自独立的常量组合(例如多个支付通道的不同商户 ID、密钥、API 地址),就用工厂函数。
- 每次调用生成全新闭包,
createConfig({ env: "prod" })和createConfig({ env: "test" })各有一套私有常量 - 常量可在初始化时计算得出,比如根据
env拼出完整 endpoint - 避免跨实例污染:A 实例改了自己的
TIMEOUT,不影响 B 实例
常量 + 行为封装更实用
私有常量很少单独存在,通常和校验逻辑、构造规则、fallback 策略一起封装。
- 在闭包内定义
function getEndpoint() { return BASE_URL + API_VERSION; },外部只调api.getEndpoint() - 敏感常量(如密钥前缀)不参与字符串拼接,而是由私有函数统一处理脱敏或加签
- 公有方法只暴露意图(
sendRequest()),不暴露常量本身或拼接细节











