2013-04-04 45 views
3

我有點失落,爲什麼下面的代碼做它做的事情。JavaScript語法瘋狂 - 任何人都知道爲什麼發生這種情況

對於下面的表達式,我期望1作爲結果,因爲在文字的右側我們實際上有一個obj。

表達:

> { a : 1 }.a 

結果鉻:

Syntax error: Unexpect token . 

結果的NodeJS

1 

(另一個問題是:爲什麼的NodeJS和鉻的不同在此(和在下面))

雖然表達式本身有語法錯誤,但將其分配給變量仍然有效。

> var x = { a : 1 }.a; x; 

結果:

1 

現在使用表達式附近的EVAL不使用eval在Chrome和的NodeJS

> eval({ a : 1 }.a) 

結果Chrome的工作和節點

1 

現在和基於字符串的expr分裂國家既不平臺的工作原理

的eval( 「{A:1} .A」)

結果鉻:

SyntaxError: Unexpected token > 

結果的NodeJS:

... //REPL waits more code 

最後括號解決了這一切,但爲什麼?

> eval("({ a : 1 }.a)") 

結果:

Works everywhere 
+0

嘗試只是一個家長的對象(無EVAL) :'({a:2} .a)'// 2 – karim79 2013-04-04 11:30:06

+0

是的。實際上,eval幾乎表現爲一個常規函數,它在參數中提供了一個表達式上下文(根據下面的正確答案) – 2013-04-04 11:32:27

+1

@PeterAronZentai'eval'代碼總是在語句上下文中運行,這就是爲什麼您需要'eval(「(」 + code +「)」)'在表達式上下文中運行代碼。例如,如果'code'是'「{a:1}」',那麼由於括號的連接,將被排除的是「{(a:1})」。 – Esailija 2013-04-04 11:37:22

回答

8

eval需要一個字符串,因此調用eval({ a : 1 }.a)相同eval("1")

在聲明上下文中,{}對塊進行分隔,而不是對象文字。您可以使用()作爲分組運算符進入表達式上下文。

所以:

{ a : 1 }.a 

實際上是一個塊,標籤,數字文字和什麼點訪問:

{ 
    a: 1 
} 

.a 

節點REPL實際上開始與一個表達式上下文中運行,但是這異常。他們運行你的代碼像eval("(" + replInput + ")")

+0

是的,這使得它很清楚。主要區別在於我們認爲控制檯提示符的實現。當然,陳述和表達語境之間的明確區分以及括號轉換的作用是真正的知識。謝謝。 – 2013-04-04 11:35:31

1

嘗試({ a : 1 }).a 這也將無處不在圓括號代碼首先執行工作,然後該對象的.a被提取。

`{ a: 1 }` 

只是一個街區,爲.操作不返回任何內容上下工夫,但在()封閉它並交還其.a提取

+0

實際上,'({a:1} .a)'也會工作...... – Christoph 2013-04-04 12:04:42

相關問題