关于javascript:break除了在循环中使用还能在哪里

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理