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
  • 根据以上制作,以下内容将是有效的,因此与上面链接的SO帖子冲突。我错过什么了吗?如果
    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