以下代码失败
let x = {this}
为什么我不能在这个?
中使用速记属性名称来自浏览器的错误消息
chrome 66.0.3359.117:Uncaught SyntaxError:Unexpected token}
firefox 59.0.1:这是一个无效的标识符
edge 41.16299.371.0:对标识符使用关键字无效
我不太了解这些消息所说的内容。
为了说清楚,以下代码运行良好
let x = 5
let y = {x}
let z = {this:this}
console.log({x,y,z})
答案 0 :(得分:15)
According to the ECMA spec(我粗略地提出了重要的内容):
12.2.6 Object Initializer
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 [?yield]}
- {PropertyDefinitionList [?yield],}
- PropertyDefinitionList [Yield]:
- 的 PropertyDefinition [?产量强>
- PropertyDefinitionList [?Yield],PropertyDefinition [?Yield]
- PropertyDefinition [Yield]:
- 的 IdentifierReference [?产量强>
- CoverInitializedName [?产量
- PropertyName [?Yield]:AssignmentExpression [In,?Yield]
- MethodDefinition [?产量
- PropertyName [收益率]:
- LiteralPropertyName
- ComputedPropertyName [?产量
- LiteralPropertyName:
- IdentifierName
- 串文字
- NumericLiteral
- ComputedPropertyName [收益率]: - [AssignmentExpression [In,?Yield]]
- CoverInitializedName [收益率]:
- IdentifierReference [?Yield] Initializer [In,?Yield]
- 初始化程序[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 Identifiers
语法
- IdentifierReference [收益率]:
- 的标识符强>
- [〜收益率]收益率
- BindingIdentifier [收益率]:
- 标识符
- [〜收益率]收益率
- LabelIdentifier [收益率]:
- 标识符
- [〜收益率]收益率
- 标识符:
- IdentifierName 但不是ReservedWord
这意味着简写let x = {
标识符 }
不允许保留字作为标识符。 this
是保留字,请查看11.6.2 Reserved Words及以后。
另一方面,我们看到扩展的写作方式是不同的:
let x = {
PropertyName :
AssignmentExpression }
其中 PropertName 是 ComputedPropertyName 或 LiteralPropertyName ,它是 IdentifierName ,不排除保留字。因此let x = {this: this}
或let x = {class: 10}
没问题。
但是,它没有解释为什么会这样,也许它会使语法复杂化或使其模糊不清?
答案 1 :(得分:5)
this
是关键字(不是变量),因此没有名称。
如果是{ x }
,x的名称为“x”,它的值为。
但是{ this }
,this
没有名字。 this
只是在解释代码时表示正确的值。