for (let i = 0; i < 100; i++) { if (i === 50) break;}
置信大家在应用break
的场景是相似下面的场景,在for循环中在特定的判断下跳出循环。
置信大家都在console上这样操作过,输出这些语句的后果到底是什么。
答案是Completion Record
Completion Record
是EMCScript规范中的一个标准类型。
它长这个样子
{[[Type]]: normal | continue | break | return | throw[[Value]]: 语句执行的后果,如果没有则是empty[[Target]]: 控制流的转移指标,通常是标签}
语句的执行都会产生一个Completion Record
在一个Block中,也会返回一个Completion Record
{ let a = 1; // 1 console.log(a); // 2 ++2; // 3 console.log(a); // 4}
大家间接把下面的代码复制在chrome 的console中而后执行,看后果是什么?
后果是2
,当初咱们逐渐剖析一下
在下面的块级作用域中,地位1产生的Completion Record
是
[[Type]]: normal,[[Value]]: empty,[[target]]: nothing
依照下面的逻辑,地位2的[[Value]]
是empty
地位3的[[Value]]
是2
地位4的[[Value]]
是empty
empty不会笼罩之前的后果
所以整个块级作用域的执行后果是2
当初有一个提案是do表达式
const w = do { let a = 1; ++2;};
可能获取块级作用域Completion Record
的[[Value]]
如果这个提案通过的话,之后的JSX将摈弃长长的三目判断
下面这个代码,如果执行foo函数输入的内容是什么?
在 try中进行return,因为存在finally,而finally无论如何都是须要被执行的,所以try的Completion Record
是
[[Type]]: return,[[Value]]: 100,[[target]]: nothing
执行到finally的时候,整个try-catch-finally代码块的Completion Record
是
[[Type]]: break,[[Value]]: empty,[[target]]: bbb
所以return会被break笼罩
最终返回的i是101