立即调用函数表达式

有时你不希望将函数作为变量访问/存储。你可以创建一个立即调用的函数表达式(简称 IIFE)。这些基本上是自动执行的匿名函数。他们可以访问周围的范围,但是函数本身和任何内部变量都无法从外部访问。关于 IIFE 的一个重要注意事项是,即使你命名你的函数,IIFE 也不会像标准函数一样被提升,也不能被它们声明的函数名称调用。

(function() {
   alert("I've run - but can't be run again because I'm immediately invoked at runtime,
          leaving behind only the result I generate");
}());

这是编写 IIFE 的另一种方式。请注意,分号前面的右括号被移动并放在右大括号后面:

(function() {
   alert("This is IIFE too.");
})();

你可以轻松地将参数传递给 IIFE:

(function(message) {
   alert(message);
}("Hello World!"));

此外,你可以将值返回到周围范围:

var example = (function() {
   return 42;
}());
console.log(example); // => 42

如果需要,可以命名 IIFE。虽然不常见,但这种模式有几个优点,例如提供可用于递归的引用,并且可以使调试更简单,因为名称包含在 callstack 中。

(function namedIIFE() { 
    throw error; // We can now see the error thrown in 'namedIIFE()'
}());

虽然在括号中包装函数是表示 Javascript 解析器期望表达式的最常用方法,但在已经预期表达式的位置,符号可以更简洁:

var a = function() { return 42 }();
console.log(a)  // => 42

Arrow 版本立即调用函数:

Version >= 6

(() => console.log("Hello!"))(); // => Hello!