Crockford 所指的语法歧义是,如果在 expression 上下文中找不到左大括号,它将被识别为 block,而不是对象文字的开头.
例如:
{"foo": "bar"} // SyntaxError
会给你一个语法错误,因为它会被解释为一个块,带有字符串文字“foo”,并且意外使用了标记:。
另一方面,括号,正式名称为the grouping operator,只能计算表达式,因此我们不会有任何语法歧义,因为块只能在语句上下文中出现。
({"foo": "bar"})
编辑:@el.pescado提出了一个有趣的问题:
你能解释一下为什么 eval('{}') 是未定义的吗?
ECMAScript 描述了一种内部类型来解释语句的行为,它被称为The Completion Specification Type。
Completion 类型的值是(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为normal且完成值为空,则返回值为undefined。
...