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

 

Tags: