立即调用函数表达式
有时你不希望将函数作为变量访问/存储。你可以创建一个立即调用的函数表达式(简称 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!