自执行匿名函数(IIFE,Immediately Invoked Function Expression)是 JavaScript 中一种定义后立即执行的函数表达式。它的核心作用是创建一个独立的作用域,避免变量污染全局环境,同时立即执行逻辑。
1. 基本语法
// 写法1(常见)
(function() {
console.log("IIFE 执行了!");
})();
// 写法2(等价)
(function() {
console.log("IIFE 执行了!");
}());
2. 核心特点
- 匿名函数:没有函数名,无法通过名称再次调用。
- 立即执行:定义后通过
()
直接触发执行。 - 独立作用域:内部变量不会泄露到全局。
3. 解决什么问题?
(1)避免变量污染全局
// 非IIFE写法:变量泄露到全局
var tmp = "全局变量";
console.log(tmp); // "全局变量"
// IIFE写法:变量隔离
(function() {
var tmp = "局部变量";
console.log(tmp); // "局部变量"
})();
console.log(typeof tmp); // "undefined"(无法访问IIFE内部的tmp)
(2)封装私有逻辑
// 模块化私有计数器
const counter = (function() {
let count = 0; // 私有变量
return {
increment: function() { return ++count; },
reset: function() { count = 0; }
};
})();
counter.increment(); // 1
counter.increment(); // 2
counter.reset(); // 重置
(3)兼容旧代码(如分号冲突)
// 避免前序代码缺少分号导致的错误
;(function() {
// 安全执行的代码
})();
4. 带参数的IIFE
可以传递外部变量到内部作用域:
(function(global, doc) {
global.sayHi = function() {
doc.write("Hello IIFE!");
};
})(window, document);
window.sayHi(); // 输出 "Hello IIFE!"
5. 与你的代码关联
你提供的代码正是用 IIFE 封装调试工具:
(function () {
// 所有变量(e, t, n, r...)都被隔离在此作用域内
// 通过 QW.provide 选择性暴露接口
})();
- 为什么用 IIFE?
- 避免
e
、t
等变量污染全局。 - 确保代码加载后立即初始化调试功能。
- 避免
6. 现代替代方案
IIFE 曾是模块化的主要手段,现在逐渐被替代:
- ES6 模块:
<script type="module">
原生支持作用域隔离。 - 块级作用域:
let/const
+{}
也能隔离变量。
总结
- IIFE = 匿名函数 + 立即执行 + 作用域隔离。
- 经典用途:封装私有变量、避免命名冲突、旧代码模块化。
- 你的代码:通过 IIFE 安全地初始化调试工具,只暴露必要的接口(如
__debuger
)。