2011-05-17 67 views
2

這兩個有什麼區別?Javascript語法差異

collapse: function(fold) 
{ 
... 
... 
} 

function collapse(fold) 
{ 
... 
... 
} 
+0

讓我換個口吻:這些有什麼區別? – sapiensgladio 2011-05-17 00:21:07

+0

1.分號,2.單詞交換':)' – 2011-05-17 00:22:46

回答

6

對象文本的上下文中的第一個外是一個語法錯誤。

但是,我相信你問的是函數表達式和函數聲明之間的區別。

您的第一個是函數表達式。您將一個匿名函數分配給一個變量。它的變量定義是,將懸掛到其作用域的頂部,但不是該函數的賦值。

第二個是函數聲明。它的整個身體懸掛在示波器的頂部。

一般而言,通常使用函數表達式,因爲它更具表現力。如果你需要遞歸地調用它(或者爲了更好的詳細的棧跟蹤),你可以給它一個名字,但是記住IE會把這個名字泄漏到外部作用域。

Further Reading

3

第一種語法在對象上聲明方法。第二個聲明瞭一個常規函數。

+1

不一定是全局的,除非它在全局命名空間中...... – Nicole 2011-05-17 00:23:19

+0

不一定是全局的。它可以嵌套在另一個函數中。 – 2011-05-17 00:24:41

+0

採取了點。答案已糾正。 – 2011-05-17 00:28:06

0

第一個是無效的JavaScript,我假設你的意思是=而不是:。這在全球範圍內是一樣的,第一個使用匿名函數,第二個只是一些語法糖來命名函數。區別在於,在非全局範圍中,首先會在全局範圍內生成一個函數,第二個將在最近的範圍中創建(對於第一個示例,使用var x = function() {}的效果相同)。

+0

它實際上是有效的,你最終會得到一個哈希函數嵌入到它,不是一個類,不太功能的土地,當定義回調作爲配置的一部分時很常見。 – Stephen 2011-05-17 00:35:02

0

第一個問題是無論當前對象是什麼(或者如果沒有當前對象,那麼它將會出錯)併爲其分配函數,都會創建一個名爲「collapse」的屬性。該函數只能通過其相關對象訪問,方法是調用obj.collapse();的行。

第二個是在全局名稱空間中創建一個名爲「collapse」的函數(即作爲window上的一個屬性)。該功能可以在任何地方通過做collapse();來調用。