0

这里

代码示例

eval("true && {a:1} && {b:2} && alert('this is ok');")

eval("{a:1} && {b:2} && alert('this should be ok~~');")

eval 跳过语法错误。

我错过了什么?

测试:

29.0.1547.76 m win7

即9

4

2 回答 2

5

{a:1}在Javascript中有两个含义

  • 对象字面量(如x = {a:1}
  • 带有标签的代码块(如while(x) {a:1}

具体解释取决于解析器遇到开场时的状态{。在“语句”状态{a:1}将是一个块,在“表达式”状态 - 一个文字。由于解析总是从语句状态开始,{a:1} && x将被读取为block && expression语法错误。相反, in x && {a:1}&&强制解析器进入“表达式”状态,并且{a:1}将是文字(无错误)。

要确保{a:1}始终是文字,请在其前面放置一个运算符或大括号以使其成为表达式,例如+{a:1},!!{a:1}({a:1})

于 2013-09-21T09:36:13.757 回答
3

问题是第二个字符串以 a 开头{,它被视为块的开头,而不是对象文字的开头。尝试这个:

eval("({a:1}) && {b:2} && alert('this should be ok~~');")

通过在第一个对象周围添加括号,它不会被解释为代码块的开头。(第二个对象{b:2}是可以的,因为它出现在&&so 之后,此时解释器并不期待一个块。)

http://jsfiddle.net/q3sZ9/1/

请注意,这不是因为您正在使用eval(): 如果您将字符串的内容直接放在脚本中,您将遇到同样的问题。

于 2013-09-21T09:36:21.130 回答