了解 ECMAScript 的 ReturnIfAbrupt(AbstractOperation())

Understanding ECMAScript's ReturnIfAbrupt(AbstractOperation())

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

According to ECMAScript ReturnIfAbrupt(AbstractOperation()) means:

  1. Let hygienicTemp be AbstractOperation().
  2. If hygienicTemp is an abrupt completion, return hygienicTemp.
  3. Else if hygienicTemp is a Completion Record, set hygienicTemp to hygienicTemp.[[Value]].

Where hygienicTemp is ephemeral and visible only in the steps pertaining to ReturnIfAbrupt.

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

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

您引用的位是针对未使用的情况。但是您的 [[Construct]] 示例 使用值。

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

Algorithms steps that say or are otherwise equivalent to:

  1. Let result be AbstractOperation(ReturnIfAbrupt(argument)).

mean the same thing as:

  1. If argument is an abrupt completion, return argument.

  2. If argument is a Completion Record, set argument to argument.[[Value]].

  3. Let result be AbstractOperation(argument).

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