【十四】JavaScript执行(四):try里面放return
2019-03-10 本文已影响8人
alanwhy
所有前端体系的集合链接:web之路
介绍JS语句执行机制涉及的一种基本类型:Comletion 类型。
Completion 类型
function foo(){
try{
return 0;
} catch(err) {
} finally {
console.log("a")
}
}
console.log(foo());
这段代码,结果告诉我们finally执行了,而且return语句也生效了。虽然return
执行了,但是函数没有立即返回,又执行了finally里面的内容
function foo(){
try{
return 0;
} catch(err) {
} finally {
return 1;
}
}
console.log(foo());
这段代码,可以看出finally中的return “覆盖”了try 中的return
这一机制的基础是JS 语句执行的完成状态,我们用一个标准类型来表示: Completion Record,用于描述异常、跳出等语句执行过程。
它表示一个语句执行完之后的结果,它有三个字段:
- [[type]] 表示完成的类型,有 break continue return throw 和 normal 几种类型
- [[value]] 表示语句的返回值,如果没有,就是empty
- [[target]] 表示语句的目标,通常是一个JS标签
先来一张语句的分类图
image.png
普通的语句
在JS中,我们把不带控制能力的语句叫普通语句
这类语句在执行时,从前到后顺次执行,没有任何分支或者重复执行逻辑
普通语句执行后,会得到[[type]]为normal 的 Completion Record(以后简称CR), JS遇到这个类型的CR,会继续执行下一条语句。
用Chrome 自带的调式工具,输入一个表达式,在控制台可以得到结果,但是在前面加一个var 就会是undefined
Chrome控制台显示的正是语句的CR的[[value]]
语句块
拿大括号括起来的一组语句,它是语句的复合结构,可以嵌套
return 语句 可能产生 return 或者 throw 类型的 CR。
{
var i = 1; // normal, empty, empty
return i; // return, 1, empty
i ++;
console.log(i)
} // return, 1, empty
控制性语句
带有if、switch关键字,分为两类
- 对其内部造成影响,如if、switch、while/for、try。
- 对外部造成影响,如break、continue、return、throw
我们需要控制语句跟break、continue、return、throw 四种类型与控制语句两两组合产生的效果。
image.png消费指对应的代码被有效的执行了,穿透指对应代码被跳过了
带标签的语句
实际上、任何JS语句都是可以加标签的,在语句前加冒号即可:
firstStatement: var i = 1;
作用就是:与完成记录类型中的target 相配合,用于跳出多层循环
outer: while(true) {
inner: while(true) {
break outer;
}
}
console.log("finished")