В ECMA-262 определено множество различных типов выражений. «Выражение», упомянутое во вступительном вопросе, лучше всего соответствует основному выражению, которое описывается следующим образом: (каждая строка с отступом является возможным представлением)
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 ;
Это позволяет только выражение без открывающей фигурной скобки или ключевого слова «функция» в начале. (FunctionDeclarations отделены от инструкций и выражений, за исключением лямбда-функций, которые являются FunctionExpression)
Определение 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:
Чтобы ответить на вопрос
Обозначение объекта в фигурных скобках, указанное как ObjectLiteral в ECMA-262, по определению допустимо. в каждом выражении, за исключением случая выражения, полученного из оператора, поскольку выражение ExpressionStatement явно запрещает появление открывающей фигурной скобки в качестве первого символа выражения для разрешения конфликта с кодовым блоком фигурной скобки (определяемым как блок). FunctionBody, Block, Program (глобальная область) и все циклические конструкции (IterationStatements) используют операторы и, следовательно, имеют ограничения, содержащие только блоки, а не ObjectLiterals в разделе кода.
Окончательно
Спецификация ограничивает фигурные скобки представлением либо блока кода, либо нотации объекта. Фигурные скобки рассматриваются как блок кода везде, где разрешено использование ключевого слова 'var', и наоборот.
person
schwer
schedule
23.03.2014