2011-11-02 60 views
12

我嘗試這個簡單的JavaScript代碼:的eval()=意外標記:錯誤

eval('{"Topics":["toto","tata","titi"]}') 

在Chrome控制檯,例如,這將返回

SyntaxError: Unexpected token :

我試圖JSON上JSONLint和它的有效。

你看到錯誤了嗎?

回答

8

FWIW,使用JSON.parse代替。比eval更安全。

8

第一:不要使用eval。

第二。只有使用eval才能做出評估。例如:

eval('var topics = {"Topics":["toto","tata","titi"]}'); 
4

因爲這是評估一個對象。 eval()要求您傳遞語法上有效的javascript,並且您所做的只是傳入一個裸露的對象。呼叫應該更像:

eval('var x = {"Topics":etc...}'); 
26

因爲eval力的表達情況和提供的字符串是無效 JavaScript程序,因此前三個令牌(以及它們是如何看)是:

{   // <-- beginning of a block, and NOT an Object literal 
"Topics"  // <-- string value, okay (note this is NOT a label) 
:   // <-- huh? expecting ";" or "}" or an operator, etc. 

快樂編碼。

+0

我可以問你爲什麼的eval(「函數(){}」)拋出一個異常呢? – BiAiB

+4

@BiAiB出於與上述相同的原因:)'eval'的內容在*語句*上下文中運行,因此它被視爲FunctionDeclaration語法結構。由此產生的錯誤是「SyntaxError:函數語句需要一個名稱」。或者給它一個名字('eval('function f(){}'); f()')或者強制它成爲一個FunctionExpression結構體('f = eval('(function(){alert(「hi」))} )'); f()')。見http://es5.github.com/x13.html – 2013-01-09 20:53:51

+0

謝謝!對我來說棘手的部分是因爲像'3'這樣的字符串被正確評估,而不是'function(){}'。第二個不能被評估爲ExpressionStatement:'一個ExpressionStatement不能以function關鍵字開始,因爲這可能會使它與FunctionDeclaration模糊不清(http://es5.github.com/x12.html#x12.4) – BiAiB

4

用途:

function evalJson(jsArray){ eval("function x(){ return "+ jsArray +"; }"); return x(); } 

var yourJson =evalJson('{"Topics":["toto","tata","titi"]}'); 

console.log(yourJson.Topics[1]); // print 'tata'' 
+0

適用於我..不知道這是否是最佳做法,但它讓我開始運行 – Patrick

+0

投票簡單 – bresleveloper

26

你必須這樣

eval('('+stingJson+')'); 

寫入一個字符串轉換爲對象

希望我的幫助!

+2

這是唯一的解決方案,在我的情況下工作。謝謝! –

+1

thx,這比接受的答案要好得多。指出eval是邪惡的:)是很好的,但是,這仍然回答了這個問題。 – apocalypz

+0

優秀!答對了! –

0

如果您正在使用JQuery的使用功能$.parseJSON(),工作對我來說,有同樣的問題