Skip to content

IIFE 意为 Immediately Invoked Functions Expression

它指的是在定义时就会立即执行的函数

js
(function () {
  ...
})()

上述语法包含两部分:

  1. () 包裹一个匿名函数。这个匿名函数拥有独立的词法作用域。这不仅避免了外界访问此 IIFE 中的变量,而且又不会污染全局作用域。
  2. 再一次使用 () 创建了一个立即执行函数表达式,JavaScript 引擎到此将直接执行函数。

IIFE 不单单有上面列举的语法,它的所有可使用语法如下:

js
// 1.缺点是无法表明函数与之后的()的整体性,但最普及,大多数库都是这种形式
(function () {
  ...
})()

// 2.能够将匿名函数与()视作整体,推荐使用
(function () {
  ...
}())

// 3.放在中括号内执行
[function () {
  ...
}()]

// 4.使用!开头
!function () {
  ...
}()

// 5.使用 + 运算符
+function () {
  ...
}()

// 6.使用 - 运算符
-function () {
  ...
}()

// 7.使用 ~ 波浪符
~function () {
  ...
}()

前文中,我们提到,模块化的目的有两个:

  1. 不污染全局变量。
  2. 更好的组织和维护代码模块之间的关系。

但显而易见的是,IIFE 并不能完全达到上述两个结果,即使 IIFE 在一定程度上减少了全局变量的污染概率。