2012-10-11 34 views
2

爲什麼第二行代碼會產生一個錯誤,但不是第三行?對象定義SyntaxError

{ foo: 'bar' } // => 'bar' 

{ "foo": 'bar' } // => SyntaxError: Invalid label 

({ "foo": 'bar' }) // => { foo: 'bar' }. 
+1

你的問題沒有意義。嘗試找到另一種方式來表達它。 – lanzz

+2

是的。所有三個都是有效的JavaScript語法。你真的在問什麼? –

+0

@mattsnider:在JS控制檯中運行代碼。 – Blender

回答

6

語言規範的相關部分是http://es5.github.com/#x12.4

ExpressionStatement:[先行∉{{function}]表達;

先行部分是指某物是隻處理作爲一種表現形式,當它出現在預期的情況下,如果它不以{或開頭3210。


{ foo: 'bar' } 

是含有表達語句'bar'與標籤foo語句塊。標籤允許您從命名循環中breakcontinue,但可以附加到任何語句,而不僅僅是循環。

{ "foo": 'bar' } 

分析器開始分析這一點,找到一個表達"foo",然後尋找一個二元運算符,但因此它失敗,出現語法異常:不是有效的二元運算符。

({ "foo": 'bar' }) 

這裏括號輸入表達式上下文,所以{被當作起動對象的構造,而不是作爲一個塊的開始。

+0

哇:)謝謝你很好回答:) –