立即呼叫函式表示式

有時你不希望將函式作為變數訪問/儲存。你可以建立一個立即呼叫的函式表示式(簡稱 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!