我知道有一些关于此的文章,但是我还没有找到一个很好的解释,说明当ReturnIfAbrupt(AbstractOperation())不是abrupt completionAbstractOperation()语句的计算结果是什么?


  根据ECMAScript ReturnIfAbrupt(AbstractOperation())表示:
  
  
  让hygienicTemp为AbstractOperation()。
  如果hygienicTemp是突然完成的,则返回hygienicTemp。
  否则,如果hygienicTemp是完成记录,则将hygienicTemp设置为hygienicTemp。[[Value]]。
  
  
  hygienicTemp是短暂的,并且仅在与ReturnIfAbrupt有关的步骤中可见。


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


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

最佳答案

您所引用的位用于不使用该值的情况。但是您的[[Construct]]示例正在使用该值。

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


  算法步骤说明或等效于:
  
  
  令结果为AbstractOperation(ReturnIfAbrupt(argument))。
  
  
  意思是:
  
  
  如果参数是一个突然完成,则返回参数。
  如果参数是完成记录,则将参数设置为argument。[[Value]]。
  令结果为AbstractOperation(argument)。
  


因此,对于Return ? envRec.GetThisBinding(),当envRec.GetThisBinding()不返回突然完成时,[[Construct]]中的该行从[[Value]]envRec.GetThisBinding()值)返回非突然完成记录的this

关于javascript - 了解ECMAScript的ReturnIfAbrupt(AbstractOperation()),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52253698/

10-09 14:08