1. 程式人生 > >js立即執行函式(function ( ){})( ) 與 (function ( ){}( )) 區別

js立即執行函式(function ( ){})( ) 與 (function ( ){}( )) 區別

結論:沒有區別。

下面說下立即執行函式表示式(IIFE)的原理:

function foo(){...} //這是函式定義,直譯器遇到它的時候,不會執行;
foo(); //這是語句,直譯器遇到語句會執行它。
這種寫法是傳統寫法,定義和執行分開,也很好理解。那為什麼還要有IIFE呢?

最主要的原因是傳統的寫法汙染了全域性名稱空間(瀏覽器裡的global物件,如window)

function(){...}()這樣寫行不行呢,答案不行。function(){...}這部分只是一個宣告,對於直譯器來說,就好像你寫了一個字串"function(){...}",需要解析函式,比如eval()才能執行。把()直接放到聲明後面是語法錯誤。

那如何才算正確呢,很簡單,只要把宣告部分變成表示式(expression)就可以了,變表示式的方法很多,最常見的方法就是用一對括號()包裹起來。

(function(){...})
還有其他的轉變表示式的方式:
!function(){...}()
+function(){...}()
void function(){...}()
所謂不會汙染全域性物件,是因為IIFE建立了一個新的函式作用域,你的業務邏輯程式碼被封裝在其中,自然不會碰觸到全域性物件,如果需要全域性物件,那就pass給IIFE:
void function(global){
//global就是全域性物件
}(this)//在瀏覽器裡,this就是window物件
(function(){...})()是把函式當作表示式解析,然後執行解析後的函式,相當於 var func = function(){...}; func(); func得到的是函式;

(function(){...}())是把函式表示式和執行當作語句直接執行,相當於var func = function(){...}(),func得到的是結果。

括號”()“起到的是自執行的作用。