首页 > 解决方案 > EcmaScript 中的调用表达式使用什么语法?

问题描述

我试图更好地理解 EcmaScript 规范中的语法是如何定义的。但是,我似乎很难理解规范中函数调用的语法是如何定义的,请采用以下函数调用(假设bar已经定义):

const foo = 1;
bar(foo);

我特别想找到允许该语法的bar(foo);语法 - 我尝试使用 Felix Kling 的这个伟大的AST explorer从中找到了CallExpression使用的CoverCallExpressionAndAsyncArrowHead

CoverCallExpressionAndAsyncArrowHead[Yield, Await] :

  • MemberExpression [?Yield, ?Await]参数[?Yield, ?Await]

因此,根据我的理解,标识符barMemberExpression并且(foo)Arguments生产规则定义,但是,在查看 Arguments 的生产规则时似乎没有任何允许(和(foo)之间的单个标识符):()

参数[Yield, Await]

  • ( )
  • (ArgumentList [?Yield, ?Await]
  • ( ArgumentList [?Yield, ?Await] , )

ArgumentList [屈服,等待]:

  • 赋值表达式[+In, ?Yield, ?Await]
  • ... 赋值表达式[+In, ?Yield, ?Await]
  • ArgumentList [?Yield, ?Await] , AssignmentExpression [+In, ?Yield, ?Await]
  • ArgumentList [?Yield, ?Await] , ... AssignmentExpression[+In, ?Yield, ?Await]

据我所见,这些都没有涵盖参数列表仅包含一个标识符的(foo)情况,它涵盖了其他情况,例如(baz = 1)(因为 baz=1 在这种情况下将是一个AssignmentExpression)等...,但没有一种情况是传递给函数的单个标识符/文字。我是在看错误的生产规则还是我在这里没有正确理解某些东西?如果我遗漏了一些明显的东西,请道歉。

标签: javascriptsyntaxlanguage-lawyergrammar

解决方案


推荐阅读