为什么在解析json字符串时,eval('('+ jsonString +')')的开放引号和括号

ind*_*vil 21 javascript json eval

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

 eval('(' + jsonString+ ')')
Run Code Online (Sandbox Code Playgroud)

解析json文本时.克罗克福德说:" 文本必须用parens包装,以避免绊倒JavaScript语法中的歧义." 在这里.那是什么意思?

我们能避免吗?

CMS*_*CMS 25

Crockford引用的语法歧义是,如果在表达式上下文中找不到打开的花括号,它将被识别为,而不是像对象文字的开头.

例如:

{"foo": "bar"} // SyntaxError
Run Code Online (Sandbox Code Playgroud)

会给你一个语法错误,因为它会被解释为一个块,带有字符串文字"foo",以及令牌的意外用法:.

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

({"foo": "bar"})
Run Code Online (Sandbox Code Playgroud)

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

你能解释为什么eval('{}')未定义?

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

于完成类型的值是的形式的三元组(type, value, target),其中type可以是normal,break,continue,return,或throw.

value可以是任何语言值empty,以及target任何标识或empty.

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

Return (normal, empty, empty).
Run Code Online (Sandbox Code Playgroud)

eval函数在执行代码并退出新创建的执行上下文后,检查已评估代码的结果完成情况,在步骤7中,我们可以看到,undefined如果完成类型为normal且完成值为,则显式返回empty:

...

7-如果result.type正常且其完成值为空,则返回undefined值.

...