在ECMA-262中定义了许多不同类型的表达式。开头问题中提到的“表达式”与 PrimaryExpression 最匹配,描述如下:(每个缩进行都是一种可能的表示)
PrimaryExpresion:
this //as the 'this'-keyword
Identifier //variable or function name ('alpha' in the question)
Literal //string, number, mathematical expressions
ArrayLiteral //[1,2,3]
ObjectLiteral // {"first" : 80}
( Expression ) //An expression encapsulated in bracket
花括号代码块:
Block :
{ StatementList_opt } - A list of statements
在这种情况下最相关的声明:
ExpressionStatement :
[lookahead ∉ {{, function}] Expression ;
这仅允许在开头没有大括号或“function”关键字的表达式。(FunctionDeclarations 与语句和表达式分开,除了作为 FunctionExpression 的 lambda 函数)
Expression 定义不直接指定 PrimaryExpression,但在很长的定义链中,PrimaryExpression 可以被视为 Expression:
Expression:
AssignmentExpression
Expression, AssingmentExpression
我确实检查了整个定义链,看看 PrimaryExpression 是否实际上是一个表达式。这是定义链:
Expression:
AssignmentExpression:
ConditionalExpression:
LogicalORExpression:
LogicalANDExpression:
BitwiseORExpression:
BitwiseXORExpression:
BitwiseANDExpression:
EuqalityExpression:
RelationalExpression:
ShiftExpressions:
AdditiveExpression:
MultiplicativeExpression:
UnaryExpression:
PostfixExpression:
LeftHandSideExpression:
NewExpression:
MemberExpression:
PrimaryExpression:
回答问题
在ECMA-262中指定为 ObjectLiteral 的大括号对象表示法根据定义在每个表达式中都有效,除非是从语句派生的表达式,因为表达式语句明确禁止将大括号作为表达式的第一个字符出现解决与大括号代码块(定义为块)的冲突。FunctionBody、Block、Program(全局范围)和所有循环构造(IterationStatements)都使用语句,因此在代码部分中只能包含 Blocks 而不是 ObjectLiterals。
最后
该规范限制大括号表示代码块或对象表示法。只要允许使用“var”关键字,大括号就会被视为代码块,反之亦然。