gpt4 book ai didi

javascript - ECMAScript 2017 中的 CallExpression 与 NewExpression

转载 作者:行者123 更新时间:2023-12-03 01:23:23 26 4
gpt4 key购买 nike

根据this SO postCallExpression 始终包含调用,因此不能成为 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

问题

  1. 为什么 MemberExpression Arguments 产生式位于 14.7 Async Arrow Function Definitions 部分? Cover 是否意味着该规则同时涵盖 CallExpressionAsyncArrowHead,而他们只是决定将其放在 14.712.3
  2. 根据上述产生,以下内容将是有效的,因此与上面链接的 SO 帖子不同。我错过了什么吗?如果NewExpression可以包含CallExpression,为什么要把它分成NewExpressionCallExpression呢?

显然有效:

new new memberExpression(args);

这是new new MemberExpression Arguments,与第一个CallExpression产生式相同。

最佳答案

Why is the MemberExpression Arguments production located in section 14.7 Async Arrow Function Definitions? Does Cover mean that the rule covers both CallExpression and AsyncArrowHead, and they just decided to put it in 14.7 instead of 12.3?

这是因为async不是关键字。这意味着在解析器中

async ()

只是对名为 async 的函数的函数调用。这意味着在像

这样的代码片段的上下文中
async () =>

直到=>被发现后,解析器无法知道它实际上正在解析什么类型的语法。这个概念是一组已知的标记,具有多个可能的输出 AST 结构,在规范中通过所谓的覆盖语法进行处理。

在规范的一般情况下,这本质上意味着 CoverCallExpressionAndAsyncArrowHead本质上定义了您可以在箭头函数头或函数调用中找到的可能结构的并集。当解析器看到=>时,它说“好吧,我解析的 CoverCallExpressionAndAsyncArrowHead 是箭头函数的头部,如果它发现除 => 以外的任何内容,那么它就知道它实际上是一个函数调用。

According to the above productions, the below would be valid, thus breaking with the SO post linked above. Am I missing something? Why divide it in NewExpression and CallExpression, if NewExpression can contain CallExpression?

我还发现其他答案中的措辞有点难以理解,尽管我确实认为它是准确的。简短的答案是然后分为 NewExpressionCallExpression因为CallExpression 需要括号,并且 NewExpression要求其中为括号。例如一般意义上的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()将对待 ()Argumentsnew MemberExpression Arguments 。自 CallExpression始终处理 ()对于函数调用,NewExpression语法仅适用于()对于构造来说是可选的,而

CallExpression:
CoverCallExpressionAndAsyncArrowHead
SuperCall
CallExpression Arguments
CallExpression [Expression]
CallExpression .IdentifierName
CallExpression TemplateLiteral

处理所有()涉及函数调用的情况new .

关于javascript - ECMAScript 2017 中的 CallExpression 与 NewExpression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51657674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com