我知道有一些关于此的文章,但是我还没有找到一个很好的解释,说明当ReturnIfAbrupt(AbstractOperation())
不是abrupt completion时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
仅与定义本身中的步骤有关。它没有暗示整个表达式的计算结果
最佳答案
您所引用的位用于不使用该值的情况。但是您的[[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/