【发布时间】:2018-08-02 15:49:23
【问题描述】:
根据this SO post,CallExpression 始终包含一个调用,因此不能成为new 运算符之后的表达式的一部分。
但是,ECMAScript 2017 表示:
MemberExpression:
PrimaryExpression
MemberExpression [Expression]
MemberExpression .IdentifierName
MemberExpression TemplateLiteral
SuperProperty
MetaProperty
new MemberExpression Arguments
还有:
NewExpression:
MemberExpression
new NewExpression
还有:
CallExpression:
CoverCallExpressionAndAsyncArrowHead
SuperCall
CallExpression Arguments
CallExpression [Expression]
CallExpression .IdentifierName
CallExpression TemplateLiteral
还有:
CoverCallExpressionAndAsyncArrowHead:
MemberExpression Arguments
问题
- 为什么
MemberExpression Arguments生产位于14.7 Async Arrow Function Definitions 部分? Cover 是否意味着该规则同时涵盖CallExpression和AsyncArrowHead,而他们只是决定将其放入14.7而不是12.3? - 根据上述产品,以下内容将是有效的,因此与上面链接的 SO 帖子不同。我错过了什么吗?既然
NewExpression可以包含CallExpression,为什么还要分NewExpression和CallExpression呢?
显然有效:
new new memberExpression(args);
这是new new MemberExpression Arguments,与第一个CallExpression生产相同。
【问题讨论】:
-
我不明白你的第二个问题。你能改写一下吗?
new new memberExpression(args);在任何地方都不会被CallExpression解析。 -
嗨@bergi。我的意思是
new MemberExpression Arguments实际上是一个有效的NewExpression,它也遵循与CallExpression相同的结构:const foo = new Bar()。注意最后的括号。我猜是因为括号是可选的,正如洛根指出的那样。 -
好吧,
Bar()部分的结构可能在MemberExpression/NewExpression和CallExpression之间是相同的,但是因为前面有一个new,所以整个事情不是CallExpression。
标签: javascript ecmascript-6 ecmascript-2017