我以前從未見過這種設計模式,它在幹什麼?未知的javascript函數聲明模式
(function(def){
if(typeof module!='undefined'){
module.exports=def;
}
else{
this.nut=def;
}
}(function(){
...
}()));
我以前從未見過這種設計模式,它在幹什麼?未知的javascript函數聲明模式
(function(def){
if(typeof module!='undefined'){
module.exports=def;
}
else{
this.nut=def;
}
}(function(){
...
}()));
這是一個「立即調用的函數表達式」,就像Ben Alman所說的那樣。定義的第一個函數需要一個參數def
。將這個函數包裝成禁忌並將其傳遞給第二個函數定義(也在圓括號中)立即調用第一個函數,並將第二個函數的結果(它也會立即調用)作爲def
參數傳遞給它。
的更多信息:http://benalman.com/news/2010/11/immediately-invoked-function-expression/
讓解碼它一步一步
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
將一個匿名函數傳遞給另一個匿名函數。 – TheZ 2012-08-08 20:25:02
你問爲什麼一個函數被傳遞給另一個函數,或者整個結構('(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
看起來像一種過於複雜的方式,使模塊在沒有CommonJS模塊支持的情況下變回全局環境。 – Esailija 2012-08-08 20:28:51