【问题标题】:Are function calls with arguments valid left-Hand-Side-Expressions according to ECMAScript根据 ECMAScript,带有参数的函数调用是否有效的左侧表达式
【发布时间】:2020-07-03 07:53:21
【问题描述】:

根据 ECMAScript,带有参数的函数调用是否有效 left-Hand-Side-Expressions

LeftHandSideExpression[Yield, Await] :
      NewExpression[?Yield, ?Await]
      CallExpression[?Yield, ?Await]
      OptionalExpression[?Yield, ?Await]

如果我们更深入地了解CallExpression,我们可以在non-terminal CallExpression 下方看到类似这样的内容:

CallExpression[?Yield, ?Await] Arguments[?Yield, ?Await]

这是否意味着写类似的东西:

alert('Hello') = 1; 

有效。如果你运行上面的代码,你会看到函数调用发生在ReferenceError: Invalid left-hand side in assignment 给出之前

【问题讨论】:

  • FWIW,这可能有用:timothygu.me/es-howto(但它不回答这个问题)。
  • 那你知道CallExpression[?Yield, ?Await] Arguments[?Yield, ?Await]是什么意思吗?好吧@T.J.Crowder

标签: javascript function arguments function-call


【解决方案1】:

这是一个非常好的问题,LeftHandSideExpression 可能不是该作品的理想名称;即使可能没有右手边也可以使用它。 :-)

在规范的后面,当判断一个赋值的目标是否有效时,规范会检查表达式 (here) 的 AssignmentTargetType。如果该类型不是simple,则分配无效。 CallExpression Arguments(例如,alert('Hello'))和其他一些(super() 等)的 AssignmentTargetTypeinvalid (here)。所以你不能分配给alert('Hello')

【讨论】:

  • 非常感谢。但你能解释一下这是什么关系:12.15.3 Static Semantics: AssignmentTargetType AssignmentExpression : YieldExpression ArrowFunction AsyncArrowFunction LeftHandSideExpression = AssignmentExpression LeftHandSideExpression AssignmentOperator AssignmentExpression 和我的问题。我看到如果那些non-terminals 出现在assignment expression (NOTE: this is how i understand this maybe its completely different and im wrong)left HandSide 中,则返回invalid,但CallExpression 不存在。
  • @Kevin - 你的alert('Hello') = 1 是一个赋值表达式。作为确定这是否是有效赋值表达式的一部分,检查其左侧 (alert('Hello')) 的 AssignmentTargetType 是否为 simple。不是,因为alert('Hello')CallExpression Arguments,它的 AssignmentTargetTypeinvalid。所以赋值表达式无效。
  • assignmentTargetType of simple 是什么意思?
  • @Kevin - 我认为这是对 LeftHandSideExpressions 进行分类的一种方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2012-03-06
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多