在認識IIFE以前先了解一下建立函數的兩種方法:函數表達式/函數聲明javascript
function test(){
//函數內容
}
test();
複製代碼
Function Declaration 能夠定義命名的函數變量,而無需給變量賦值。
必要條件:html
Function Expression 將函數定義爲表達式語句(一般是變量賦值)的一部分。Function Expression 不能以「function」開頭.
經過 Function Expression 定義的函數能夠是命名的,也能夠是匿名的。
如下是匿名函數表達式:java
var test=function(){
//函數內容
}
test();
複製代碼
如下是命名函數表達式:express
var sub = function f(a1,a2){
return a1-a2;
}
console.log(f(5,3)); //錯誤調用方式
console.log(sub(5,3)); //正確調用方式
複製代碼
在這個例子中,函數表達式的名稱爲f,這個名稱f實際上變成了函數內部的一個局部變量,而且指代函數對象自己,在函數遞歸的時候有很大用處。segmentfault
釋義:定義函數以後,當即調用該函數,這種函數就被稱做當即執行函數,全稱爲當即調用的函數表達式 IIFE=Imdiately Invoked Function Expression
函數表達式經過末尾的() 來調用並運行就是一個IIFE。
經常使用寫法:閉包
(function(){ /* code */ }());
(function(){ /* code */ })();
void function(){ /* code */ };
複製代碼
其餘寫法:函數
var i = function(){ return 10; }();
true && function(){ /* code */ }();
0, function(){ /* code */ }();
!function(){ /* code */ }();
~function(){ /* code */ }();
-function(){ /* code */ }();
+function(){ /* code */ }();
new function(){ /* code */ };
new function(){ /* code */ }();
複製代碼
這麼寫的緣由?性能
不讓function出如今行首,讓引擎將其理解成一個表達式
(javascript引擎規定,若是function關鍵字出如今行首,一概解釋成函數聲明語句)ui
IIFE做用
IIFE的目的是爲了隔離做用域,防止污染全局命名空間。spa
參考:
JavaScript中函數聲明與函數表達式的區別詳解
JavaScript 函數表達式
理解 JavaScript(二)(關於理解函數做用域和變量/對象提高的一篇文章)
說一說JS的IIFE關於IIFE解釋比較簡潔易懂
IIFE對IIFE寫法的性能及最佳實踐有所舉例
深刻理解閉包系列第三篇——IIFE
JavaScript:當即執行函數表達式(IIFE)一篇譯文
當即執行函數: (function ( ){...})( ) 與 (function ( ){...}( )) 有什麼區別?
JavaScript的()()原理是什麼 湯姆大叔javascript深刻理解