立即执行函数(IIFE)通过“执行即封闭”形成独立词法作用域,使内部变量(如let apiKey)无法被外部访问,配合闭包可返回受限接口(如add、count方法),实现可控暴露与数据保护,是ES6前主流的轻量封装方式。

立即执行函数(IIFE)是保护核心数据最直接、轻量的方式之一——它靠“执行即封闭”天然形成一道作用域屏障,让变量和逻辑不暴露在全局或外层作用域中。
用 IIFE 划出独立作用域
函数内部会创建自己的词法作用域,而 IIFE 的关键在于:定义完立刻执行,且只执行一次。这使得所有在其中用 let、const 或 var 声明的变量,生命周期仅限于该函数体内。
- 外部无法访问内部变量,比如
let apiKey = 'xxx'写在里面,外面调console.log(apiKey)就会报错 - 即使同名变量在外层存在,IIFE 内部也会优先使用自己的副本,不会污染或覆盖外部值
- 没有 return 或显式暴露,内部一切都“静默收场”,不留痕迹
返回接口,只放行需要的操作
真正要保护的数据,往往不是完全藏起来,而是“可控地露出来”。IIFE 常配合闭包,返回一个对象或函数,把私有状态锁在内部,只开放有限方法。
- 例如:
const cart = (function() { let items = []; return { add(item) { items.push(item); }, count() { return items.length; } }; })(); -
items永远不可直接读写,但cart.add()和cart.count()可以安全操作它 - 这种模式叫“揭示模块模式(Revealing Module Pattern)”,是 ES6 模块普及前的主流封装方式
传入依赖,避免硬编码和全局耦合
核心数据常依赖外部环境(如 window、document、第三方库),IIFE 支持传参,把依赖显式注入,既解耦又便于测试。
立即学习“Java免费学习笔记(深入)”;
- 写法示例:
(function(global, $) { /* 使用 global.document 或 $.ajax */ })(window, jQuery); - 这样既能用到全局对象,又不假设它们一定存在;万一环境没 jQuery,也不会报
$ is not defined - 参数名可任意命名(如
win、jq),进一步隔离命名空间
注意边界细节,防止意外泄露
看似简单,但几个细节决定是否真能守住核心数据:
- 别漏写 分号:前一行若以表达式结尾(如
let x = 1),后面紧接 IIFE 可能被误连成1(function(){...})(),导致报错——建议 IIFE 前加; - 避免隐式全局:不写
var/let/const直接赋值(如secret = 'abc')在非严格模式下会挂到window,破坏私有性 - 慎用箭头函数 IIFE:虽然
(( ) => { })()合法,但它没有自己的this和arguments,也不支持new.target,多数场景仍推荐传统函数写法


















