說一說JS的IIFE

2021-09-19 07:18:03 字數 2129 閱讀 5996

iife: immediately invoked function expression,意為立即呼叫的函式表示式,也就是說,宣告函式的同時立即呼叫這個函式。

對比一下,這是不採用iife時的函式宣告和函式呼叫:

function foo()

foo();

下面是iife形式的函式呼叫:

(functionfoo())();

函式的宣告和iif

函式的宣告和iife的區別在於,在函式的宣告中,我們首先看到的是function關鍵字,而iife我們首先看到的是左邊的(。也就是說,使用一對()將函式的宣告括起來,使得js編譯器不再認為這是乙個函式宣告,而是乙個iife,即需要立刻執行宣告的函式。

兩者達到的目的是相同的,都是宣告了乙個函式foo並且隨後呼叫函式foo。

如果只是為了立即執行乙個函式,顯然iife所帶來的好處有限。實際上,iife的出現是為了彌補js在scope方面的缺陷:js只有全域性作用域(global scope)、函式作用域(function scope),從es6開始才有塊級作用域(block scope)。對比現在流行的其他物件導向的語言可以看出,js在訪問控制這方面是多麼的脆弱!那麼如何實現作用域的隔離呢?在js中,只有function,只有function,只有function才能實現作用域隔離,因此如果要將一段**中的變數、函式等的定義隔離出來,只能將這段**封裝到乙個函式中。

在我們通常的理解中,將**封裝到函式中的目的是為了復用。在js中,當然宣告函式的目的在大多數情況下也是為了復用,但是js迫於作用域控制手段的貧乏,我們也經常看到只使用一次的函式:這通常的目的是為了隔離作用域了!既然只使用一次,那麼立即執行好了!既然只使用一次,函式的名字也省掉了!這就是iife的由來。

根據最後表示函式執行的一對()位置的不同,常見的iife寫法有兩種,示例如下:

列表 1:iife寫法一

(function foo())();

列表 2:iife寫法二

(functionfoo()());

這兩種寫法效果完全一樣,使用哪種寫法取決於你的風格,貌似第一種寫法比較常見。

其實,iife不限於()的表現形式[

1],但是還是遵守約定俗成的習慣比較好。

根據《you don』t know js:scope & clouses》[

2]的說法,盡量避免使用匿名函式。但是iife確實只執行一次,給iife起個名字有些畫蛇添足了。如果非要給iife起個名字,乾脆就叫iife好了。

iife可以帶(多個)引數,比如下面的形式:

var a = 2;

(function iife(global))(window);

console.log(a); // 2

js的模組就是函式,最常見的模組定義如下:

functionmymodule()

functiondootherthing()

return}

varfoo=mymodule();

foo.dosomething();

foo.dootherthing();

varfoo1=mymodule();

foo1.dosomething();

如果需要乙個單例模式的模組,那麼可以利用iife:

var mymodule=(functionmodule()

functiondootherthing()

return

})();

mymodule.dosomething();

mymodule.dootherthing();

iife的目的是為了隔離作用域,防止汙染全域性命名空間。

es6以後也許有更好的訪問控制手段(模組?類?),有待研究。 1

ben alman, 「immediately-invoked function expression (iife)「.

2kyle simpson, you don』t know js:scope & clouses (, 2014).

說一說JS的IIFE

iife immediately invoked function expression,意為立即呼叫的函式表示式,也就是說,宣告函式的同時立即呼叫這個函式。對比一下,這是不採用iife時的函式宣告和函式呼叫 function foo window console.log a 2 js的模組就是函式...

簡單的說一說mmap

mmap memory map,就是記憶體對映 簡單的說就是將檔案對映到使用者的位址空間中。這麼做有什麼好處呢?1.傳統檔案訪問方式是,首先用open系統呼叫開啟檔案,然後使用read,write等呼叫進行順序或者隨即的i o.這種方式是非常低效的,每一次i o操作都需要一次系統呼叫.而通過mmap...

說一說 r與 n

今天在用python讀取txt檔案的時候,遇到了乙個比較坑的問題,那就是 n 和 r 究竟有什麼區別?在計算機還沒有出現之前,人們設計了一種機器叫做電傳打字機,這種機器每秒鐘可以打10個字元。不過它有個問題,就是打完一行換行的時候,需要0.2s,正好可以列印兩個字元,如果這個時候有新的字元傳過來,那...