2015-09-26 73 views
0

之間有什麼區別今天,我的工作是在javascript的某個時間點堆棧。函數FunctionName(){}和object.FunctionName = function(){}

我想知道那是什麼

function FunctionName(){ 
    //Code goes here; 
} 

而且

var MyFuncCollection = new Object(); 

MyFuncCollection.FunctionName = function(){ 
    //Code goes here; 
} 

之間的基本區別兩者都是工作相同。那麼之間有什麼區別。使用帶有對象名稱的函數有什麼好處嗎?我已閱讀Question。但它使用變量並分配函數特定變量。我想創建對象並在單個對象中分配多個函數。

+0

可能重複的[VAR functionName =函數(){} VS功能使用functionName(){}](http://stackoverflow.com/questions/336859/var-functionname-函數 - 函數 - 函數名) – ydaniv

+0

不重複,它的問題,它分配函數到特定的變量。我想我創建一個對象並分配多個函數對象。 –

+0

對不起,隊友,這是完全一樣的JS。不同的是,您將該var存儲在一個對象上。 – ydaniv

回答

1

第一個定義了一個全局函數名稱。如果你加載兩個庫,並且他們都試圖定義FunctionName,它們將會相互衝突。你只會得到最後定義的那個。

第二個只有一個全局變量,MyFuncCollection。所有的功能都被定義爲該變量中的屬性。因此,如果您有兩個試圖定義相同函數名稱的集合,其中一個將是FuncCollection1.FunctionName,另一個將是FuncCollection2.FunctionName,並且不會有任何衝突。

唯一的衝突是如果兩個集合都試圖使用相同的名稱爲集合本身,這是不太可能的。但這並不是完全沒有聽說過的:有幾家圖書館試圖使用$作爲他們的主要標識符。 jQuery是最突出的,它提供jQuery.noConflict()來刪除它的$綁定並恢復到以前的綁定。

1

簡而言之,對象上下文中的方法使用父對象上下文,而「全局」函數具有自己的對象上下文。

漫長的回答涉及JavaScript的一般面向對象方法,儘管JavaScript中的所有內容都是一個對象,您也可以使用此方法創建數組。

我真的不能告訴你爲什麼,但我的經驗最好的函數定義既不是提及的頂部,但:

var myFunction = function(){}; 

它是可以分配的功能變量,你甚至可能寫這樣的定義:

MyObject.myMethod = function(){}; 

進一步的閱讀有各種在線教材,可以給你更多,更深的關於這個主題的信息。

+1

函數聲明沒有提到它裏面的值。這是它被調用的方式來定義它。 – ydaniv

0

我總是發現的一個主要優點是代碼更簡潔,覆蓋函數的機會更少。然而它遠不止於此。

您的範圍在對象內完全更改。請看下面的代碼::

功能:

function FunctionName(){ 
    return this; 
} 
FunctionName() 

返回:

Window {top: Window, location: Location, document: document, window: Window, external: Object…} 

對象:

var MyFuncCollection = new Object(); 
MyFuncCollection.FunctionName = function(){ 
    return this; 
} 
MyFuncCollection.FunctionName() 

返回:

Object {} 

這導致菊花鏈功能等一些很好的功能。

+0

一個函數聲明裏面沒有提及'this'的值。這是它被調用的方式來定義它。 – ydaniv

+0

這是顯示關鍵區別的信息。這與調用方法無關。啊沒關係。在你回答之後,我看到你低估了每個人。 ;) – Jesse

+0

首先,像這樣的問題存在的問題是新開發人員閱讀了這樣的答案,相信這是'JS'在JS中定義的方式,完全錯過了JS中的委託和函數式編程。 – ydaniv

0

第一:

function functionName(){ 
    //Code goes here; 
} 

是一個function declaration。它定義了function對象的背景下,這是寫在

注意:此必須是global上下文並將其doesn't什麼關於this它裏面的值時,它的調用。 More about scopes in JavaScript

秒注意:在moststyleguides函數聲明,只有當它是一個constructor一個大寫的名字。

第二:

var myFuncCollection = {}; 

myFuncCollection.functionName = function() { 
    //Code goes here; 
}; 

通知:不使用new Object()語法,它被認爲是不好的做法,用new與任何其他然後函數的構造。改爲使用文字形式(如上所述)。

function expression簡單分配給Object的屬性。

再一樣通知應該說明:這沒有說明this被調用時的值。 this在調用function對象時會給出一個值,詳細信息請參考see here

當然,在一個Object幫助避免與在同一背景下的其他變量/函數聲明命名衝突放置function,但是這可能是一個函數的局部範圍內,而不一定是global上下文。

從語言的角度來看,除了這些差異之外,關於使用一堆函數聲明或帶有一堆方法的對象沒有區別。

從設計的角度來看,在Object上放置方法允許您將邏輯分組和/或封裝到應包含它的特定對象。這是Object Oriented Programming範例含義的一部分。

當您希望導出或簡單地將所有這些功能傳遞給另一個separate module時,也可以這麼做。

這就是關於它(:

相關問題