为什么eval('('+ jsonString +')')在parsingjsonstring时需要打开引号和括号

你能告诉我这个特定的语法结构的原因吗?

eval('(' + jsonString+ ')') 

parsingjson文本时。 克罗克福德说:“ 文本必须包装在parens中,以避免绊住JavaScript语法的歧义 。” 这里 。 这意味着什么?

我们可以避免吗?

Crockford提到的语法歧义是,如果在expression式上下文中没有find开放的大括号,它将被识别为一个块 ,而不像对象文字的开始。

例如:

 {"foo": "bar"} // SyntaxError 

会给你一个语法错误,因为它会被解释为一个块,一个string文字“foo”,以及令牌的意外使用:

另一方面,正式名为分组操作符的括号只能计算expression式,因此我们不会有任何语法歧义,因为只能在语句上下文中使用块。

 ({"foo": "bar"}) 

编辑: @ el.pescado提出了一个有趣的问题:

你能解释为什么eval('{}')是不确定的吗?

ECMAScript描述了一个内部types来解释语句的行为,它被称为完成规范types 。

Completiontypes的值是(type, value, target)forms的三元组,其中type可以是normalbreakcontinuereturnthrow

value可以是任何语言值或empty值,并且指定任何标识符或empty

一个空白块(生产Block : {} )显式返回以下完成:

 Return (normal, empty, empty). 

eval函数在执行代码之后,退出新创build的执行上下文,检查评估代码的结果完成情况,并在步骤7中看到,如果完成typesnormal且完成值为empty

如果result.type是正常的,并且它的完成值是空的,则返回undefined值。

对象字面量需要用括号括起来,以在eval上下文和其他上下文中正确评估:

eval('{}')是未定义的,例如。 而eval('(' + '{}' + ')' )计算结果为Object。

如果你在控制台尝试了这个,例如: {"foo":"bar"}它会向你扔出一个无效的标签。 用圆括号把它包起来,它就成了一个有效的expression式。

@ el.pescado,由eval执行后的string应该是javascript可以理解的。 即,如果您将以上string分配给variables,如下所示

eval('var foo1 = {“foo”:“bar”}'); foo1.foo会返回吧

所以,我的假设是,因为没有像JavaScript中的“{”开头那样的陈述,它正在抛出错误。