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是正常的并且其完成值为空,则返回未定义的值。
…



