-
completion类型
造成以下这种差异是因为 js中的Completion Recordfunction foo(){ try{ return 0; } catch(err) { } finally { console.log("a") } } console.log(foo()); function foo(){ try{ return 0; } catch(err) { } finally { return 1; } } console.log(foo());
-
Completion Record ( 利用这些语句类型 就可以在复杂的嵌套结构中进行控制 )
Completion Record表示一个语句执行完之后的结果,有三个字段:
[[type]] 表示完成的类型,有 break continue return throw 和 normal 几种类型; [[value]] 表示语句的返回值,如果语句没有,则是 empty; [[target]] 表示语句的目标,通常是一个 JavaScript 标签(标签在后文会有介绍)。
a. 普通语句 (
执行后会得到[[type]]为normal的 Completion Record
只有表达式语句才会产生[[value]]
)
声明类语句
var声明
const声明
let声明
函数声明
类声明
表达式语句
空语句
with语句
debugger语句b. 语句块
return 语句可能产生 return 或者 throw 类型{ var i = 1; // normal, empty, empty i ++; // normal, 1, empty console.log(i) //normal, undefined, empty } // normal, undefined, empty 如果语句块内部的 Completion Record的[[type]]不为 normal 则会打断语句块后续的语句执行 { var i = 1; // normal, empty, empty return i; // return, 1, empty i ++; console.log(i) } // return, 1, empty
c. 控制型语句
穿透: 不在当前这一层处理 向外逐层寻找可以"消费"的那一层 直到最后没找到就报错break continue return throw if 穿透 穿透 穿透 穿透 switch 消费 穿透 穿透 穿透 for/while 消费 消费 穿透 穿透 function 报错 报错 消费 穿透 try 特殊处理 特殊处理 特殊处理 消费 catch 特殊处理 特殊处理 特殊处理 穿透 finally 特殊处理 特殊处理 特殊处理 穿透 function test() { var a = 0; switch (a) { case 0: if (true) { console.log("111"); break; } } if (true) { console.log("222"); } } test(); // 111 // 222 * 代码执行到 break | if 遇到 break break穿透到上一层 switch 遇到 break break被消费了 if switch for for for...of for-await-of for...in while while do-while continue break return throw try
d. 带标签的语句
-
JavaScript 语句可以加标签
test_var: var i = 1;
js执行(4)
最新推荐文章于 2024-07-19 12:58:53 发布