IIFE通过函数表达式加立即调用创建独立私有作用域,利用函数天然作用域边界隔离变量与函数,避免全局污染,支持传参依赖注入和闭包暴露可控接口。

JavaScript 中函数作用域在 IIFE 里的应用,核心是利用函数天然形成的作用域边界,把变量、函数“关进去”,不让它们跑到全局去。
用括号把函数变成表达式,才能立即执行
JS 引擎看到 function() { } 默认当函数声明处理,而函数声明不能直接加 () 调用。所以必须让它变成函数表达式:
-
(function() { /* 代码 */ })();—— 最常用,外层括号强制转为表达式 -
!function() { /* 代码 */ }();—— 取反运算符也起同样作用 -
~function() { /* 代码 */ }();或+function() { /* 代码 */ }();—— 同理,一元运算符触发表达式解析
内部变量自动私有,不污染全局
只要在 IIFE 内用 var、let 或 const 声明,这些变量就只属于这个函数作用域:
-
var count = 0;—— 外部访问会报ReferenceError - 即使漏写
var(非严格模式),name = 'Tom'会意外挂到window上,所以务必显式声明 - 函数声明也受作用域限制:
function helper() { }在外部不可见
靠闭包暴露可控接口,实现封装
IIFE 执行一次后,内部作用域本该销毁,但若返回一个引用了内部变量的函数,闭包就保留了那个环境:
立即学习“Java免费学习笔记(深入)”;
const api = (function() { let data = []; return { push(x) { data.push(x); }, len() { return data.length; } }; })();- 外部只能调
api.push()和api.len(),data完全不可见 - 每个 IIFE 实例都有独立的闭包环境,多个模块互不影响
传参模拟依赖注入,提升可维护性
IIFE 支持接收参数,常用于把全局对象或外部模块“送进来”,既明确依赖,又避免硬编码:
(function($, utils) { $('.btn').on('click', utils.handleClick); })(jQuery, MyUtils);- 参数名
$是局部变量,压缩时可安全缩成单字母 - 如果
jQuery没加载,这里立刻报错,比运行中突然找不到$更早暴露问题


















