iife 通过闭包创建私有作用域,将敏感数据和辅助逻辑封装在函数体内,仅暴露受控方法接口,实现数据与行为的双重隔离,并支持工厂模式生成多实例及运行时防护措施。

直接用立即执行函数(IIFE)包裹数据和操作逻辑,返回仅含受控接口的对象,私有变量就自然“锁住”了——外部既读不到、改不了,也遍历不出来。
用 IIFE 划出不可穿透的私有边界
IIFE 是最轻量、全环境兼容的私有沙箱。所有敏感数据(比如 token、缓存数组、计数器)都声明在函数体内,不挂到返回对象上:
- let cache = new Map()、const config = { timeout: 3000 } 这类声明只在函数作用域内有效
- return 的对象里只放方法,如 { get(key), set(key, val), clear() },它们因闭包能访问 cache,但外部无法绕过方法直接碰 cache
- console.log(dataStore.cache) 输出 undefined;for...in 遍历 dataStore 也看不到 cache 属性
把校验、加密、日志等行为一并收进闭包
私有不只是藏数据,更是藏逻辑。辅助函数写在 IIFE 内部,对外完全不可见:
- 定义私有函数如 validateInput()、encryptPayload()、logAccess(),只供公有方法调用
- 例如 set(key, val) 内部先调 validateInput(val),再 encryptPayload(val),最后存入 cache —— 整个流程对外透明,细节对内封闭
- 敏感操作(如密钥拼接、字段脱敏)全程不暴露原始值,也不落全局变量
需要多实例?改用工厂函数,别用单例
一个数据仓不够用时(比如多个用户会话、不同业务模块),用工厂函数替代 IIFE:
- function createDataStore(options = {}) { ... return { get, set, clear }; },每次调用生成全新闭包环境
- 每个实例拥有独立的 cache、token、counter,互不干扰
- 传入配置项(如 namespace: 'user-123'、ttl: 60000),实现差异化初始化
运行时防护:避免调试或序列化意外泄露
即使变量已私有,也要防默认行为透出:
- 重写返回对象的 toString(),返回 "[DataStore]" 而非实际内容
- 禁用 JSON.stringify(dataStore) 输出空对象 {},可加自定义 toJSON() 返回占位结构
- 不在公有方法中 console.log 原始敏感值;调试时依赖 Chrome DevTools 的 Closure 面板查看,生产环境无此入口











