【发布时间】:2019-02-14 15:31:08
【问题描述】:
我知道有一些关于此的帖子,但我还没有找到一个很好的解释来解释当 AbstractOperation() 不是 abrupt completion 时 ReturnIfAbrupt(AbstractOperation()) 语句的评估结果?
根据ECMAScript ReturnIfAbrupt(AbstractOperation()) 表示:
- 设 hygienicTemp 为 AbstractOperation()。
- 如果 hygienicTemp 突然完成,则返回 hygienicTemp。
- 否则,如果 hygienicTemp 是完成记录,请将 hygienicTemp 设置为 hygienicTemp。[[Value]]。
其中 hygienicTemp 是短暂的,仅在与 ReturnIfAbrupt 相关的步骤中可见。
以[[Construct]]操作的最后一行为例:
- 那行是
Return ? envRec.GetThisBinding() - 这是equivalent to:
Return ReturnIfAbrupt(envRec.GetThisBinding()) - 假设
GetThisBinding()没有抛出Error(即没有突然完成),我不知道实际返回的是什么 - 上面引用的
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