2009-06-08 85 views
33

我學會(艱難地),我需要添加的括號JSON數據,如下所示:爲什麼JavaScript的eval需要括號來評估JSON數據?

stuff = eval('(' + data_from_the_wire + ')'); 
// where data_from_the_wire was, for example {"text": "hello"} 

(在Firefox 3中,至少)。

背後有什麼原因呢?我討厭編寫代碼而不理解引擎蓋後面的內容。

+1

我看你是不是以英語爲母語,但「(」和「)」的括號內。如果你糾正這個問題,它可能會幫助其他人找到你的帖子。 – 2009-06-08 11:26:53

回答

38

把括號圍繞data_from_the_wire實際上等同於

stuff = eval('return ' + data_from_the_wire + ';'); 

如果你不使用括號給eval,那麼代碼會被評估,如果你沒有在它裏面的任何命名函數那些將被定義,但沒有返回。

以一個例子來調用就像韓中創建的功能的能力:

(function() { alert('whoot'); })() 

將調用剛剛定義的功能。下面,但是,不工作:

function() { alert('whoot'); }() 

所以我們看到,括號有效的把那麼代碼到返回表達式,而不只是代碼運行。

-2

我不知道,我真的對這個答案感興趣,但我的猜測是,沒有括號,data_from_the_wire中的數據將被解釋爲閉包。也許括號強制評估,所以關聯數組是'返回'。

這是導致雖然= downvotes)的那種猜測。

編輯

道格拉斯克羅克福德提到他JSON現場語法歧義,但並沒有真正幫助我。

10

我不確定原因,但我使用json.orgthe JSON class來解析JSON。這比使用eval更安全。

+5

爲什麼downvote? 這似乎是一個有效的答案。 使用eval是不安全的。 – 2009-06-08 11:57:46

+0

他不問如何正確使用eval來解析JSON,他問爲什麼需要括號。 – 2012-01-08 15:01:36

62

eval接受JavaScript語句序列。 Javascript解析器 將在語句中出現的'{'標記解釋爲塊的開始,而不是對象文本的開始。

當你把你的文字括入像這樣的括號:({ data_from_the_wire }) 你正在將JavaScript解析器切換到表達式解析模式。令牌「{」的表達式的內部意味着對象文本聲明的開始和的塊,並且因此使用Javascript接受它作爲對象常量。

2

這是因爲沒有JavaScript試圖解釋{"text": ...a label,未能圓括號。在控制檯中嘗試一下,你會得到「無效標籤」錯誤。

1

它實際上取決於data_from_the_wire的值。在大多數情況下,您的語法正常,但以{開頭的行會被解析爲標籤,並且您的語法無效。如果用圓括號括起來,它可以防止解析器誤解你的表達。

只是一個解析問題,真的。用字符串,數字或函數,你不會有這個問題。

一個解決方案是總是評估指令而不是表達式。你可以寫

eval('var stuff = {"text": "hello"}'); 
9

在JavaScript中,花括號用於創建語句塊:

{ 
var foo = "bar"; 
var blah = "baz"; 
doSomething(); 
} 

以上線路可以把一個字符串中和eval uated沒有問題。現在考慮這個:

{ 
"foo": "bar", 
"blah": "baz" 
} 

大括號導致JavaScript引擎認爲它是一組表現,因此周圍的:字符的語法錯誤。從MDN...JavaScript Guide...Object Literals引用:

您不應該在語句的開頭使用對象字面值。 這將導致錯誤或不按預期運行,因爲將被解釋爲塊的開始。

()中包裝對象字面值的解決方法是讓引擎將其內容視爲表達式而不是塊語句。所以這不起作用:

({ 
var foo = "bar"; 
var blah = "baz"; 
doSomething(evil); 
}) 
// parse error 

但這:

({ 
"foo": "bar", 
"blah": "baz" 
}) 
// returns object 
相關問題