2012-08-08 72 views
0

我以前從未見過這種設計模式,它在幹什麼?未知的javascript函數聲明模式

(function(def){ 
    if(typeof module!='undefined'){ 
     module.exports=def; 
    } 
    else{ 
     this.nut=def; 
    } 
}(function(){ 
    ... 
}())); 
+2

將一個匿名函數傳遞給另一個匿名函數。 – TheZ 2012-08-08 20:25:02

+0

你問爲什麼一個函數被傳遞給另一個函數,或者整個結構('(function(foo){...}(bar))')如何工作?可能是http://stackoverflow.com/questions/592396/what-is-the-purpose-of-a-self-executing-function-in-javascript的副本。 – 2012-08-08 20:25:34

+2

看起來像一種過於複雜的方式,使模塊在沒有CommonJS模塊支持的情況下變回全局環境。 – Esailija 2012-08-08 20:28:51

回答

2

這是一個「立即調用的函數表達式」,就像Ben Alman所說的那樣。定義的第一個函數需要一個參數def。將這個函數包裝成禁忌並將其傳遞給第二個函數定義(也在圓括號中)立即調用第一個函數,並將第二個函數的結果(它也會立即調用)作爲def參數傳遞給它。

的更多信息:http://benalman.com/news/2010/11/immediately-invoked-function-expression/

1

讓解碼它一步一步

function(def) 
{ 
    if(typeof module!='undefined'){ 
     module.exports=def; 
    } 
    else{ 
     this.nut=def; 
    } 
}(function(){}()); 

//外括號除去 現在爲u可以看到一個函數被定義,其是定義的功能的正常方式
需要一個參數def
立即定義後有一個支架
所以如果我們進一步分解,然後

function(def) //function 1 
    { 
     if(typeof module!='undefined'){ 
      module.exports=def; 
     } 
     else{ 
      this.nut=def; 
     } 
    }(function() /*function 2*/{}()); 

這只是意味着,第二個功能是作爲參數傳遞給第一功能
通過了bracket()只是在後一個JS函數的定義,意味着該功能在這裏function 1將會立即定義後調用。括號內的內容將作爲參數傳遞給函數,因此def基本上是function2