IIFE (Immediately Invoked Function Expression) 是在宣告完函式後馬上執行的一種函式。
這裡嘗試把一般的函式呼叫,改寫成匿名函式:
// original
function greeting() { console.log("Hi"); }
greeting();
// IIFE
(function () { console.log("Hi"); })();
這種形式包含
()
包起來的匿名函式(anonymous function)。()
後用expression ()
執行函式。即使不是宣告匿名函式,也可以正常運行,只是沒什麼意義:
(function greeting() { console.log("Hi"); })();
// output: "Hi"
IIFE 的用途,通常是 避免變數汙染到global scope:
(function () {
var name = "apple";
return name;
})();
console.log(name);
// output: "" ( in browser )
→ 因為在函式內宣告的變數只有function scope,因此不會影響到全域變數。
如果把 IIFE 指派給變數,會儲存回傳值,不會儲存 function 本身:
let hi = (function () {
let hi = "Hi!!";
return hi;
})();
console.log(hi);
// output: Hi!!
Ans. 不是, function foo(){ }() → (
function foo(){ })
(); 在function外加上(小括號),foo可以刪除。
var foo = "Hello";
(function() {
var bar = " World";
alert(foo + bar);
})();
alert(foo + bar);
Ans. "Hello World" ; (錯誤訊息)ReferenceError: bar is not defined
var a = 1
(function(){console.log(a);})()
Ans. 出現錯誤, 程式碼沒有斷句,1會被當成function呼叫。
可以看成這樣:
var a = 1(function(){console.log(a);})()
// TypeError: 1 is not a function
4.請問以下立即函式會出現什麼訊息?
(題目來自 六角學院 的 觀念測驗:JavaScript 熱門面試題。)
(function(){
console.log('六角學院 A');
}());
(function(){
console.log('六角學院 B');
});
Ans. 六角學院 A / (){ console.log('六角學院 B'); }
第一個答案會執行,是因為符合 JSLint 的版本。
第二個答案則是只包裹了function但沒有執行,所以回傳了整個function。
【如內文有誤還請不吝告知>< 謝謝閱覽至此的各位:D】
參考資料:
-----正文結束-----
非同步請求是我的罩門,所以前幾天的文章都看資料看得很痛苦。
今天寫IIFE整個加速而且快樂很多。
BTW 昨天的文章有補充fetch API的部分,有興趣可以回去看看。