你能告诉我这个特定语法结构的原因吗
eval('(' + jsonString+ ')')
解析json文本时。Crockford 说“文本必须用括号括起来,以避免在 JavaScript 语法中出现歧义。” 在这里。这意味着什么?
我们能避免吗?
你能告诉我这个特定语法结构的原因吗
eval('(' + jsonString+ ')')
解析json文本时。Crockford 说“文本必须用括号括起来,以避免在 JavaScript 语法中出现歧义。” 在这里。这意味着什么?
我们能避免吗?
Crockford 提到的语法歧义是,如果在表达式上下文中找不到左花括号,它将被识别为块,而不是对象文字的开始。
例如:
{"foo": "bar"} // SyntaxError
会给你一个语法错误,因为它会被解释为一个块,带有字符串文字“foo”,以及 token 的意外用法:
。
另一方面,括号,正式称为分组运算符,只能计算表达式,因此我们不会有任何语法歧义,因为块只能在语句上下文中出现。
({"foo": "bar"})
编辑: @el.pescado提出了一个有趣的问题:
你能解释一下为什么 eval('{}') 是未定义的吗?
ECMAScript 描述了一个内部类型来解释语句的行为,它被称为完成规范类型。
于完成类型的值是的形式的三元组(type, value, target)
,其中type
可以是normal
,break
,continue
,return
,或throw
。
value
可以是任何语言值或empty
,以及target
任何标识符或empty
。
一个空块(生产Block : {}
)明确返回以下完成:
Return (normal, empty, empty).
该eval
函数在执行完代码后,退出新创建的执行上下文,检查所评估代码的结果完成情况,在步骤 7 中我们可以看到,undefined
如果完成类型为normal
,完成值为,则显式返回empty
:
...
7- 如果 result.type 是正常的并且其完成值为空,则返回值 undefined。
...
对象字面量需要用括号括起来才能在eval
上下文和其他上下文中正确评估:
eval('{}')
例如,未定义。而eval('(' + '{}' + ')' )
评估为对象。
例如,如果您在控制台中尝试此操作:{"foo":"bar"}
它会向您抛出一个无效标签。将它括在括号中,它就成为一个有效的表达式。
@el.pescado,eval执行后的字符串应该是javascript可以理解的。即,如果您将上述字符串分配给变量,如下所示
eval(' var foo1 = {"foo" : "bar"}'); foo1.foo 将返回 bar
所以,我的假设是,因为在 javascript 中没有像“{”这样的语句,它会抛出错误。