2012-03-30 75 views
1

为什么像"{opacity: 1.0, width: '132px'}"这样的字符串不能按原样使用eval()进行评估?Javascript - eval()`{}`表达式

eval("{opacity: 1.0, width: '132px'}"); 

// invalid label 
// {opacity: 1.0, width: '132px'} 
// ---------------ꜛ 

eval("v = {opacity: 1.0, width: '132px'}"); 

// works! 

回答

6

为什么像"{opacity: 1.0, width: '132px'}"这样的字符串不能使用eval()原样评估?

由于发生,其中一个语句或块料,不是表达式,所以{表示block的开始,一个object initializer的不是开始的文本。 (然后opacity:被解释为label接着语句分离器[逗号],然后width:看起来像另一个标签,这是无效的存在。)

把它们放大括号改变解析上下文,以便表达预计,因此{打开初始化程序。 (这与您使用圆括号自动执行匿名函数的原因相同,例如(function(){ ... })();而不仅仅是function(){ ... }();。)

+0

从技术上讲,原因是语法在解析[Statement](http://es5.github.com/#x12)时偏好规则“BlockStatement”的规则“Block” – georg 2012-03-30 13:40:10

1
尝试

是这样的:

eval("({opacity: 1.0, width: '132px'})"); 
+0

正确答案。这是因为'{...}'是一个无效的javascript表达式,但是'(...)'是有效的。 – ninjagecko 2012-03-30 12:52:51

3

为什么可以像 “{不透明度 '132px'::1.0,宽度}” 的字符串使用eval不能评价()作为是?

因为{opacity: 1.0, width: '132px'}是无效的JavaScript原样。尝试按照原样放置此语句,您将得到一个js错误。另一方面v = {opacity: 1.0, width: '132px'}是有效的JavaScript。

+0

'{opacity:1.0,width:'132px'}'是完全有效的javascript。 – georg 2012-03-30 13:26:51

+0

@ thg435,你确定吗?下面为我​​生成一个javascript错误:http://jsfiddle.net/n4yMx/ – 2012-03-30 13:29:38

+0

这个归结于你的“有效”的定义,我想。 – georg 2012-03-30 13:38:30