Следующий код не работает
let x = {this}
Следующий код не работает
let x = {this}
В соответствии с спецификацией ECMA (я выделен жирным шрифтом, что важно):
12.2.6 Инициализатор объектов
NOTE 1 An object initializer is an expression describing the initialization of an Object, written in a form resembling a literal. It is a list of zero or more pairs of property keys and associated values, enclosed in curly brackets. The values need not be literals; they are evaluated each time the object initializer is evaluated.
Синтаксис
- ObjectLiteral [Выход]:
- {}
- {PropertyDefinitionList [? Выход]}
- {PropertyDefinitionList [? Выход],}
- PropertyDefinitionList [Выход]:
- PropertyDefinition [? Выход]
- PropertyDefinitionList [? Yield], PropertyDefinition [? Выход]
- PropertyDefinition [Выход]:
- IdentifierReference [? Выход]
- CoverInitializedName [? Выход]
- PropertyName [? Yield]: AssignmentExpression [In,? Выход]
- MethodDefinition [? Выход]
- СвойствоName [Выход]:
- LiteralPropertyName
- ComputedPropertyName [? Выход]
- LiteralPropertyName:
- ИмяИдентификатора
- СтроковойЛитерал
- ЧисловойЛитерал
- ComputedPropertyName [Выход]: - [AssignmentExpression [In,? Yield]]
- CoverInitializedName [Выход]:
- IdentifierReference [? Yield] Инициализатор [In,? Выход]
- Инициализатор [In, Yield]:
- = AssignmentExpression [? In,? Yield]
NOTE 2 MethodDefinition is defined in 14.3.
NOTE 3 In certain contexts, ObjectLiteral is used as a cover grammar for a more restricted secondary grammar. The CoverInitializedName production is necessary to fully cover these secondary grammars. However, use of this production results in an early Syntax Error in normal contexts where an actual ObjectLiteral is expected.
12.1 Идентификаторы
Синтаксис
- IdentifierReference [Выход]:
- Идентификатор
- Выход [~ Выход]
- BindingIdentifier [Выход]:
- Идентификатор
- Выход [~ Выход]
- LabelIdentifier [Выход]:
- Идентификатор
- Выход [~ Выход]
- Идентификатор:
- ИдентификаторName, но не ReservedWord
Это означает, что в сокращении let x = {
Идентификатор }
не разрешает зарезервированные слова как Идентификатор. И this
зарезервированное слово, посмотрите 11.6.2 Зарезервированные слова и далее. С другой стороны, мы видим, что расширенный способ ее написания отличается: let x = {
PropertyName :
AssignmentExpression }
где PropertName - это либо ComputedPropertyName, либо LiteralPropertyName, которое является идентификаторомName, которое не исключает зарезервированные слова. Таким образом, let x = {this: this}
или let x = {class: 10}
не проблема. Однако это не объясняет, почему это так, может быть, это усложнит грамматику или сделает ее двусмысленной?
this
в Javascript - это ключевое слово (а не переменная), поэтому оно не имеет имени.
В случае { x }
, x имеет имя, "x" и значение.
Но { this }
, this
не имеет никакого имени. this
просто представляет собой правильное значение, когда код интерпретируется.