2010-10-19 115 views
7

我是一個困惑的新手。聲明javascript對象與var與函數之間有什麼區別?

function myObject() { 
    this.myProperty = "a string"; 
    this.myMethod = function() { 
     //Method code 
    } 
} 

然後我讀別的地方,你創建一個對象,像這樣:

var myObject = { 
    myProperty: "a string", 
    myMethod : function() { 
     //Method code 
    } 
} 

是什麼(非主觀的)區別我在你創建一個JavaScript對象,像這樣的教程閱讀兩者之間?有正確的方式和錯誤的方式嗎?

回答

5

這兩個聲明都是正確的,但它們有不同的語義。

第一種類型的聲明可以讓你創建對象的實例:

var t = new myObject(); 
// then use t 
t.myProperty = "some value"; 

var otherT = new myObject(); 
otherT.myProperty = "some other value"; 

二是幾乎像一個靜態對象:

myObject.myProperty = "some value"; 
+1

我寧可打電話給第二個沒有構造函數的* singleton *。 – galambalazs 2010-10-19 15:38:14

+0

感謝您將它與靜態對象進行比較。這是解釋它的好方法。 – randomable 2010-10-19 16:31:29

3

這是一個直接的比較.. 。

function myObject() { 

這聲明函數時JavaScript解析...

var myObject = function() { 

這在運行時聲明該函數。

如果您使用「var」方法,則必須在使用它之前聲明您的函數......嘗試此示例。

myFunction(); // Works 
myVarFunction(); // Boom 

var myVarFunction = function() { alert("Hi"); }; 

function myFunction() { alert("Hi"); }; 

那麼爲什麼要使用「var」方法,如果你必須更小心地使用它?這與範圍有關......範圍內的功能被認爲更好。

更新:而且這裏有一些偉大的解釋:

var functionName = function() {} vs function functionName() {}

+0

感謝您的鏈接!一個答案說var是有範圍的,但是另一個答案糾正了它,說它們都是有範圍的。我對它進行了測試,在我看來,var和function的作用範圍都是一樣的。或者有沒有其他的條件? – randomable 2010-10-19 16:37:53

+0

@randomable - 是的,在這種情況下的範圍似乎會造成混淆......我可能是另一個受害者。看看這個:https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope – Fenton 2010-10-20 08:17:15

0

兩者之間的主要區別是一個變量是本地的,另一個是全球性的。 「var」基本上定義了變量的範圍。

當我們將var添加到變量值賦值中時,javascript確保變量被限制爲分配給它的任何函數,並且不會與另一個函數中的同名變量相沖突。

當我們不使用var時,它被聲明爲全局函數並且可能發生碰撞。所以在變量賦值之前使用「var」總是可取的。如果需要,請使用匿名函數關閉。