2011-11-02 126 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(),工作对我来说,有同样的问题