您能否告诉我这种特定语法结构的原因
eval('(' + jsonString+ ')')
解析json文本时。克罗克福德说:“ 文本必须用括号括起来,以避免绊倒JavaScript语法 。” 在这里。那是什么意思?
我们可以避免吗?
Crockford所指的语法含糊之处在于,如果在 表达式 上下文中未找到一个开放的花括号,则该花括号将被识别为一个块,而不是一个对象文字的开头。
例如:
{"foo": "bar"} // SyntaxError
会给您一个语法错误,因为它将被解释为一个块,字符串字面量为“ foo”,并且意外使用了token :。
:
另一方面,圆括号(正式称为分组运算符)只能计算表达式,因此我们不会有任何语法歧义,因为只能在 语句 上下文中使用块。
({"foo": "bar"})
编辑: @ el.pescado提出了一个有趣的问题:
您能解释为什么未定义eval(’{}’)吗?
ECMAScript描述了一种内部类型来解释语句的行为,称为完成规范类型。
于完成类型的值是的形式的三元组(type, value, target),其中type可以是normal,break,continue,return,或throw。
(type, value, target)
type
normal
break
continue
return
throw
value可以是任何语言值或empty,也可以是任何target标识符或empty。
value
empty
target
空块(生产Block : {})显式返回以下完成:
Block : {}
Return (normal, empty, empty).
该eval函数在执行代码后退出新创建的执行上下文,检查所评估代码的结果完成情况,在步骤7中,我们可以看到,undefined如果完成类型为normal且完成值为,则显式返回该值empty:
eval
undefined
… 7-如果result.type是正常的并且其完成值为空,则返回未定义的值。 …
…
7-如果result.type是正常的并且其完成值为空,则返回未定义的值。