能否明确规范中所有返回值类型的记录均返回Completion Record?
ECMAScript规范中Completion Record返回值的清晰解读
咱先把核心结论摆出来:并不是所有返回值类型的记录都返回Completion Record,但规范里的算法有一个极强的默认规则——绝大多数情况都会返回Completion Record。
先看看你提到的规范段落,这正是关键依据:
6.2.3.2 隐式完成值 本规范的算法通常隐式返回[[Type]]为normal的Completion Record。除非上下文另有明确说明,否则返回非Completion Record值的算法语句……
给你拆解一下这个规则的细节:
- 默认行为优先:只要某个算法没有明确说明它返回的是非Completion Record类型的值,那它的返回结果必然是包裹了实际计算值的、[[Type]]为normal的Completion Record。哪怕算法描述里只写了“返回计算后的数值”,这个数值也会被自动打包成normal类型的Completion Record。
- 例外需明确标注:只有当规范特意指出某个算法返回的是原始类型(比如“返回一个布尔值”“返回字符串”)时,才会直接返回非Completion Record的值。这种情况在规范里属于少数特殊场景。
- 设计逻辑:Completion Record的核心作用是管控代码的执行流程(比如break、throw语句会生成对应类型的Completion Record来中断或跳转流程),所以默认包裹能让整个规范的流程处理逻辑保持统一,避免零散的返回值类型带来的混乱。
总结一下,你可以记住这个判断准则:规范算法的返回值,默认都是Completion Record;只有当规范明确说“返回X(非Completion Record类型)”时,才是例外。这个规则覆盖了几乎所有你会遇到的规范场景。
内容的提问来源于stack exchange,提问作者MaximPro
相关产品推荐
相关产品推荐

