2014-07-22 38 views
0

我目前正在調試一些代碼,但我無法讓自己圍繞這個概念在JavaScript中。關於此Javascript代碼構建

I have this code construct. 
if(!COMPANY) 
    COMPANY = {}; 

COMPANY.Billing = (function(COMPANY){ 
    //More code 
})(COMPANY); 

至於,我明白了,它創建了一個名爲「公司」的對象,然後添加一個名爲「結算」 ,但我不明白傳球同樣「公司」到函數的參數的想法新的屬性並在 同時重新命名爲「公司」。我的意思是 以上的代碼和下面的代碼之間的區別是什麼。

COMPANY.Billing = (function(COMPANY){ 
    //More code 
})(); 

我的JavaScript不是很深,所以我想明白上面的代碼構造手段。這可能是一些JavaScript設計模式,但我不知道它是什麼

+1

嘗試閱讀[此問題](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work?rq=1)關於如何關閉工作。它可能會幫助你。 –

+0

你剛在公司內部定義了該功能。 – epascarello

+0

區別在於你沒有向匿名函數傳遞任何東西的第二個代碼塊。它會改變內部的代碼行爲。 –

回答

1

它不是重命名COMPANY;它正在使用它。您的代碼的註釋版本:

if(!COMPANY)   // if COMPANY doesn't exist... 
    COMPANY = {};  // initialize it to a blank object 

COMPANY.Billing =  // initialize a property 
    (function(COMPANY){ // this defines a function 
     //More code 
    })(COMPANY);  // this executes the function with COMPANY as the parameter 
// COMPANY.Billing now contains the result of executing the anonymous function 

這稱爲閉包。示例:

foo = (function(x) { 
    return ++x; 
})(4); 

這定義了一個函數,然後用參數x = 4執行。因此,它返回++x,這是5。因此,foo分配值5

當你這樣做:

COMPANY.Billing = (function(COMPANY){ 
    //More code 
})(); 

要定義關閉並執行它,但你是路過毫無作爲一個參數。所以,COMPANY在閉包內部是未定義的。

+0

哦哇......那麼快......我在第一個例子中,我上面聲明的同一個對象作爲參數傳遞給匿名函數?我想知道爲什麼你需要這樣做,正如我一直在閱讀的那樣,COMPANY變量是全局範圍的,所以爲什麼不直接在匿名函數中訪問呢?對不起,如果我的問題可能是模糊的,但我只想進一步瞭解。你的帖子回答了我的一些疑問。謝謝。 –

+2

有一個變量'COMPANY',它的範圍是全局的,但是命名參數'COMPANY'就好像你在函數裏面有'var COMPANY'一樣。爲了重用我上面的例子,假設你有'x = 6; foo =(function(x){return ++ x;})();' 然後'foo'是'NaN',因爲閉包中使用的全局'x'和'x'是不同的。 –

+0

非常感謝你。我想我有我急需的headstart調試這些JavaScript文件。你的解釋確實有助於我理解這個概念。給你更多的力量! –