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,正好可以列印兩個字元,如果這個時候有新的字元傳過來,那...