自执行匿名函数(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?
    1. 避免 et 等变量污染全局。
    2. 确保代码加载后立即初始化调试功能。

6. 现代替代方案

IIFE 曾是模块化的主要手段,现在逐渐被替代:

  • ES6 模块<script type="module"> 原生支持作用域隔离。
  • 块级作用域let/const + {} 也能隔离变量。

总结

  • IIFE = 匿名函数 + 立即执行 + 作用域隔离。
  • 经典用途:封装私有变量、避免命名冲突、旧代码模块化。
  • 你的代码:通过 IIFE 安全地初始化调试工具,只暴露必要的接口(如 __debuger)。