IIFE默认返回undefined,仅显式return的内容才可被外部获取;需警惕ASI导致return被截断、分支遗漏返回值及赋值语句缺失等问题。
自执行函数(iife)本身会立即执行并返回其内部最后一句表达式的值。如果没显式 return,默认返回 undefined——这正是模块暴露失败最常见的根源。
看函数体末尾有没有 return 语句
很多开发者误以为只要在 IIFE 里定义了变量或对象,它就会自动“暴露”出去。实际上,只有被 return 的内容才会成为 IIFE 的返回值,也才是外部能拿到的模块接口。
- ✅ 正确:最后明确 return { init, destroy } —— 外部可解构使用
- ❌ 错误:函数体以 console.log('loaded') 或空语句结尾 —— 返回 undefined
- ⚠️ 隐患:用 if (...) { return obj } 但分支遗漏 else,某些路径无返回 —— 返回值不可控
警惕分号自动插入(ASI)导致 return 被截断
JavaScript 在换行处可能自动插入分号,尤其当 return 后紧跟换行和对象字面量时,引擎会把 return; 当作完整语句,后面的对象变成孤立代码,不被返回。
- ❌ 危险写法:
return
{ name: 'mod', version: 1 } → 实际等价于 return; + { name: 'mod', ... }(后者无效) - ✅ 安全写法:
return { name: 'mod', version: 1 };(对象与 return 在同一行)
或用括号包裹:return ({ name: 'mod', version: 1 });
检查模块加载顺序与作用域污染
IIFE 的返回值是否被正确赋值给全局变量或传入模块系统(如 AMD、UMD),直接影响后续依赖能否访问到它。
- 确保赋值语句存在且位置正确,例如:window.MyModule = (function(){ ... return api; })();
- 避免多个 IIFE 写入同一个全局名却未做存在性判断,导致后加载的覆盖前一个有效模块
- 若用于 UMD 模块包装,需验证 root.myModule = factory() 中的 factory() 确实返回了预期对象
用简单测试快速验证返回值
不必等集成环境出问题,开发阶段就可直接在控制台或单元测试中验证:
- 复制 IIFE 表达式(不含 var/let 声明),粘贴执行,观察控制台输出是否为期望对象
- 对返回值做 typeof 和 Object.keys() 检查,确认结构完整
- 若返回值是函数,尝试调用它;若是对象,尝试访问关键属性——失败即说明暴露异常

















