【问题标题】:Understanding ECMAScript's ReturnIfAbrupt(AbstractOperation())理解 ECMAScript 的 ReturnIfAbrupt(AbstractOperation())
【发布时间】:2019-02-14 15:31:08
【问题描述】:

我知道有一些关于此的帖子,但我还没有找到一个很好的解释来解释当 AbstractOperation() 不是 abrupt completionReturnIfAbrupt(AbstractOperation()) 语句的评估结果?

根据ECMAScript ReturnIfAbrupt(AbstractOperation()) 表示:

  1. 设 hygienicTemp 为 AbstractOperation()。
  2. 如果 hygienicTemp 突然完成,则返回 hygienicTemp。
  3. 否则,如果 hygienicTemp 是完成记录,请将 hygienicTemp 设置为 hygienicTemp。[[Value]]。

其中 hygienicTemp 是短暂的,仅在与 ReturnIfAbrupt 相关的步骤中可见。

[[Construct]]操作的最后一行为例:

  1. 那行是Return ? envRec.GetThisBinding()
  2. 这是equivalent toReturn ReturnIfAbrupt(envRec.GetThisBinding())
  3. 假设GetThisBinding() 没有抛出Error(即没有突然完成),我不知道实际返回的是什么
  4. 上面引用的ReturnIfAbrupt 定义明确指出hygenicTemp 仅与定义本身中的步骤有关。它没有暗示整个表达式的计算结果

【问题讨论】:

  • 如果我理解正确,这意味着完成记录已“解包”并返回其[[Value]]
  • 感谢@FelixKling。这也是我的怀疑,但我在规范对ReturnIfAbrupt 的定义中找不到任何支持该结论的证据。它基本上说hygenicTemp 是短暂的,并且在定义之外无法访问。因此,我觉得这只是猜测。
  • 它曾经像这样“简单”:ecma-international.org/ecma-262/6.0/#sec-returnifabrupt。因此,如果有意义的话,它就相当于:arg = <some operation>; if (IsAbrupt(arg)) { return arg; } else { arg = arg.[[Value]]};

标签: javascript ecmascript-6 ecmascript-5 ecmascript-2017


【解决方案1】:

您引用的位是在值 使用时。但是您的[[Construct]] 示例正在使用该值。

为此,您需要向下滚动一点:

表示或以其他方式等效的算法步骤:

  1. 让结果为 AbstractOperation(ReturnIfAbrupt(argument))。

意思相同:

  1. 如果参数是一个突然完成,返回参数。

  2. 如果参数是完成记录,则将参数设置为参数。[[值]]。

  3. 让结果为 AbstractOperation(argument)。

所以对于Return ? envRec.GetThisBinding(),当envRec.GetThisBinding() 不返回突然完成时,[[Construct]] 中的那一行返回来自envRec.GetThisBinding() 的非突然完成记录的[[Value]]this 值) .

【讨论】:

  • 我不确定您引用的部分是否适用于此。 [[Construct]] 中的那一行不会将 ReturnIfAbrupt(argument) 的“结果”传递给其他操作。但也许Return在这里被认为是一个操作,所以它是“等价的”?
  • @FelixKling - 是的,Return 正在使用该值,这就是为什么这部分适用而不是问题中引用的部分。 "Return ? envRec.GetThisBinding()" 只是写 "Let X be ? envRec.GetThisBinding()" 然后 "Return X" 的更短方式。
  • Facepalm,我不知何故错过了那部分。这正是我想要的,谢谢 TJ。 @FelixKling,上面写着Algorithms steps that say or are otherwise equivalent to:...,而Return ReturnIfAbrupt(op) 返回ReturnIfAbrupt(op) 的结果(假设没有abrupt completion)。所以据我了解,最后一行是由这个定义捕获的。
猜你喜欢
  • 2013-12-30
  • 2020-07-12
  • 1970-01-01
  • 2019-01-22
  • 2021-02-18
  • 2012-01-06
  • 2012-10-11
  • 1970-01-01
  • 2015-09-27
相关资源
最近更新 更多