【十四】JavaScript执行(四):try里面放return,finally还会执行吗?
所有前台体系的集合链接: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")
参考原文:JavaScript执行(四):try里面放return,finally还会执行吗?
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 【十四】JavaScript执行(四):try里面放return,finally还会执行吗?