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

Javascript 解析json字符串时,为什么要使用eval(';';+;jsonString+;';)和';)的开放引号和括号,javascript,json,eval,Javascript,Json,Eval,你能告诉我这种特殊语法结构的原因吗 eval('(' + jsonString+ ')') 解析json文本时。Crockford说,“文本必须用括号包装,以避免被JavaScript语法中的歧义绊倒。”。这是什么意思 我们可以避免它吗?需要将对象文字括在括号中,以便在eval上下文和其他上下文中正确计算: 例如,eval({}')是未定义的。而eval('('+'{}'+''))的计算结果是对象 如果您在控制台中尝试此操作,例如:{“foo”:“bar”}它会向您抛出一个无效的标签。将它括

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

 eval('(' + jsonString+ ')')
解析json文本时。Crockford说,“文本必须用括号包装,以避免被JavaScript语法中的歧义绊倒。”。这是什么意思


我们可以避免它吗?

需要将对象文字括在括号中,以便在
eval
上下文和其他上下文中正确计算:

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


如果您在控制台中尝试此操作,例如:
{“foo”:“bar”}
它会向您抛出一个无效的标签。将它括在括号中,它将成为一个有效的表达式。

Crockford所指的语法歧义是,如果在表达式上下文中找不到一个开大括号,它将被识别为一个,而不是一个对象文字的开头

例如:

{"foo": "bar"} // SyntaxError
将给您一个语法错误,因为它将被解释为一个块,带有字符串文本“foo”,并且意外使用了标记

另一方面,正式调用的括号只能计算表达式,因此我们不会有任何语法歧义,因为块只能在语句上下文中出现


编辑:提出了一个有趣的问题:

你能解释一下为什么eval({})没有定义吗

ECMAScript描述了一个内部类型来解释语句的行为,称为

完成类型的值是
(类型、值、目标)
形式的三元组,其中
类型
可以是
正常
中断
继续
返回
,或
抛出

可以是任何语言值或
,以及
目标
任何标识符或

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

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

7-如果result.type为normal且其完成值为空,则返回未定义的值


@el.pescado,eval执行后的字符串应该是javascript可理解的。 i、 e如果您将上述字符串指定给变量,如下所示

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


所以,我的假设是,因为没有以“{”开头的语句在javascript中,它抛出了错误。

如果你继续阅读你引用的句子,从你链接到的页面上,你会看到为什么你根本不应该使用
eval
来完成这项工作,避免eval的原因是我知道的,无论如何,谢谢你指出。你能解释一下
eval({})的原因吗
未定义?@el.pescado:有趣的问题,检查my.A被认为是一条语句,
eval(“{}”)
不会产生任何错误,它只是一个空块。
var
在传递给
eval()
的字符串中似乎是非法的,您的代码是否在一些旧浏览器中工作(可能仅支持ES3)?看这篇从未发表过的博文草稿,关于
Return (normal, empty, empty).