JavaScript 立即執行函數 IIFE (Immediately Invoked Function Expression) / Self-invoking Function
立即執行函數 (Immediately Invoked Function Expression,簡稱 IIFE) 是一個在宣告的當下就會馬上被執行的函數。
語法:
(function () {
// 寫在這裡面的程式碼
// 會立刻被執行
}());
或把 () 移到外面也可以:
(function () {
// 寫在這裡面的程式碼
// 會立刻被執行
})();
IIFE 本質是一個會被立刻執行的匿名函數 (anonymous function),使用 IIFE 的一個最大好處是避免污染全域變數命名空間 (global namespace)。
用法例如:
(function () {
// foo 是一個區域變數
var foo = 'hello world';
// 顯示 hello world
alert(foo);
}());
// 這行會發生錯誤,因為 foo 變數不存在
// 意即全域變數命名空間不會被污染!
//
// Uncaught ReferenceError: foo is not defined
alert(foo);
立即執行函數可以用來減少全域變數的使用,因為在 IIFF 中的變數是區域變數,所以很常被使用來包裝只會被執行一次的程式碼,或是程式初始化的 code。
跟一般函數一樣,IIFE 可以傳參數進去,例如:
(function (w, d, $) {
// w 是一個局部變數,指向 window 物件
// d 是一個局部變數,指向 document 物件
// $ 是一個局部變數,指向 jQuery 物件
}(window, document, jQuery));
在上面這個例子中,我們將全域變數 window, document, jQuery 當成參數傳遞進去立即執行函數中,除了可以在函數中使用不同的變數名稱,還有一個好處是會讓程式效能略微提升,因為 JavaScript 查找變數時,會先找區域變數找不到再去找全域變數。
跟一般函數一樣,IIFE 可以有返回值 (return value),例如:
// 將立即執行函數的返回值,指定給 foo 變數
var foo = (function () {
// 返回一個 object
return {
hello: function () {
return 'Hello';
}
};
}());
// 顯示 Hello
alert(foo.hello());