Javascript ECMAScript 2017中的CallExpression与NewExpression
根据,一个Javascript ECMAScript 2017中的CallExpression与NewExpression,javascript,ecmascript-6,ecmascript-2017,Javascript,Ecmascript 6,Ecmascript 2017,根据,一个CallExpression总是包含一个调用,因此不能是new操作符后面的表达式的一部分 然而,缔约国: 以及: 以及: 以及: 问题 为什么MemberExpression参数产品位于节中?Cover是否意味着规则同时涵盖了CallExpression和AsyncArrowHead,他们只是决定将其放在14.7而不是12.3 根据以上制作,以下内容将是有效的,因此与上面链接的SO帖子冲突。我错过什么了吗?如果NewExpression可以包含CallExpression,为什么要将其
CallExpression
总是包含一个调用,因此不能是new
操作符后面的表达式的一部分
然而,缔约国:
以及:
以及:
以及:
问题
MemberExpression参数
产品位于节中?Cover是否意味着规则同时涵盖了CallExpression
和AsyncArrowHead
,他们只是决定将其放在14.7
而不是12.3
NewExpression
可以包含CallExpression
,为什么要将其划分为NewExpression
和CallExpression
new new memberExpression(args);
这是新成员表达式参数,与第一个调用表达式产品相同
为什么MemberExpression参数产品位于第14.7节异步箭头函数定义中?Cover是否意味着该规则同时涵盖CallExpression和AsyncArrowHead,而他们只是决定将其放在14.7而不是12.3中
这是因为async
不是关键字。这意味着在解析器中
async ()
只是对名为async
的函数的函数调用。这意味着在类似
async () =>
在找到=>
之前,解析器无法知道它实际解析的语法类型。这个概念是一组已知的令牌,具有多种可能的输出AST结构,在规范中通过所谓的覆盖语法来处理
在规范的一般情况下,这本质上意味着CoverCallExpressionAndSyncArrowhead
定义了箭头函数头或函数调用中可能存在的结构的并集。当解析器看到=>
时,它会说“好的,我解析的CoverCallExpressionAndSyncArrowhead
是一个箭头函数的头部,如果它找到了=>
之外的任何东西,那么它就知道它实际上是一个函数调用
根据上面的结果,下面的内容将是有效的,因此与上面的SO post链接中断。我是否遗漏了什么?如果NewExpression可以包含CallExpression,为什么要将其划分为NewExpression和CallExpression
我还发现另一个答案中的措辞有点难以理解,尽管我确实认为它是准确的。简短的回答是,然后被分为NewExpression
和CallExpression
,因为CallExpression
需要paren,而NewExpression
要求没有paren。例如,在一般意义上,new
是一个关键字,它构造右边的任何东西。如果你做new Foo
,它将构造Foo
。如果你做new obj.Foo
,它将读取obj.Foo
,然后从中构造一个对象。这意味着从语法上来说,你几乎可以认为它们是等价的新界:
// 1
var _tmp = Foo;
new _tmp;
// 2
var _tmp = obj.Foo;
new _tmp;
但事实并非如此,因为它们是不同的:
// 3
var _tmp = Foo();
new _tmp;
// 4
new Foo();
new
关键字有可选的括号,正是这种行为需要在语法中进行分割
NewExpression:
MemberExpression
new NewExpression
它总是直接跳到MemberExpression
,这意味着new obj()
将把()
当作新成员表达式参数中的参数。因为调用表达式
总是处理()
对于函数调用,NewExpression
语法仅适用于构造可选的()
,而
CallExpression:
CoverCallExpressionAndAsyncArrowHead
SuperCall
CallExpression Arguments
CallExpression [Expression]
CallExpression .IdentifierName
CallExpression TemplateLiteral
处理所有涉及函数调用的()
案例,这些函数调用没有新的非常感谢Logan。快速澄清:您的意思是在新的obj()
中,obj()
被视为新成员表达式参数
(不仅仅是()
-部分)?以下是我应用的语法替换:NewExpression:new NewExpression-->new MemberExpression-->new new MemberExpression Arguments
。或者:NewExpression:MemberExpression-->new MemberExpression Arguments
另一件我不太清楚的事情是:左侧表达式到底是什么de>,如果它不是应该在操作符左侧的(比如在赋值中)?显然,如果lefthandideexpression
是Reference
类型,赋值只对lefthandideexpression
有效。哦,是的,我的意思是()
将触发使用newmemberexpression参数
grammar“我不确定我是否遵循了这些例子。一个有一个new
关键字,另一个有两个,因此这里只适用NewExpression:MemberExpression-->new MemberExpression参数。我通常认为左侧表达式基本上是可以分配给的任何对象。这种行为是以嵌套方式定义的,因为在你真正到达=
之前,它不知道某个东西是否是左手的,所以在此之前,它可能是左手的,也可能不是。关于LHS表达式是什么,下面的so帖子突出了一些有趣的东西:新对象
是有效的LeftHandside表达式
,但无法为其赋值(显然是因为它不是引用
类型)?我不明白您的第二个问题。你能换个说法吗<代码>新建成员表达式(args)代码>不使用调用表达式解析。Hi@bergi。我的意思是,newmemberexpression参数
实际上是一个有效的NewExpression
,并且
// 1
var _tmp = Foo;
new _tmp;
// 2
var _tmp = obj.Foo;
new _tmp;
// 3
var _tmp = Foo();
new _tmp;
// 4
new Foo();
NewExpression:
MemberExpression
new NewExpression
CallExpression:
CoverCallExpressionAndAsyncArrowHead
SuperCall
CallExpression Arguments
CallExpression [Expression]
CallExpression .IdentifierName
CallExpression TemplateLiteral