JS的IIFE
1. 定義
IIFE: Immediately Invoked Function Expression,意為立即調用的函數表達式,也就是說,聲明函數的同時立即調用這個函數。
首先我們要了解一般情況下什麼是函數聲明語句,什麼是函數表達式語句,以便於接下來的實驗。
辨別方法:以「function」開頭的有名稱的函數是函數聲明語句。
function a(); //函數聲明語句
var a = function(); //函數表達式語句
下面分析一道面試題:
var a = function(){} var b = function(){} console.log(a()+b());//輸出結果是NaN
為什麼輸出結果是 NaN 呢?
因為解釋器會把前面的 a() 認為是一個語句塊的結束,後面的 『+』 一元運算符有把後面 b() 轉換為數字這麼一個功能,所以得到的結果是NaN。因此我們在做自執行函數的時候,要把函數的聲明變為函數表達式,這樣就不會影響輸出的結果了。
2. IIFE的常見形式
寫法一:
(function(){ })()
寫法二:
(function(){ }())
這兩種寫法效果完全一樣,使用哪種寫法取決於你的風格,貌似第一種寫法比較常見。
3. IIFE的函數名和參數
不過函數名在這裡沒有意義,因為整個函數在執行時就立即調用了。當然也可以給一個函數名,這裡我們就叫 IIFE。IIFE可以帶(多個)參數,比如下面的形式:
var a = 2; (function IIFE(global){ var a = 3; console.log(a); // 3 console.log(global.a); // 2 })(window); console.log(a); // 2
這裡 window是形參,global是實參,var a = 3 只在 IIFE 函數作用域中起效。
4. IIFE的優點
1. 創建塊級(私有)作用域,避免了向全局作用域中添加變量和函數,因此也避免了多人開發中全局變量和函數的命名衝突
2. IIFE中定義的任何變量和函數,都會在執行結束時被銷毀。這種做法可以減少閉包佔用的內存問題,因為沒有指向匿名函數的引用。只要函數執行完畢,就可以立即銷毀其作用域鏈了。
以上參考 //www.cnblogs.com/keketest/p/6121228.html、//www.jianshu.com/p/af9283d20ba5、//www.cnblogs.com/yiven/p/8462666.html