【十四】JavaScript执行(四):try里面放return,finally还会执行吗?

作者 : 开心源码 本文共1318个字,预计阅读时间需要4分钟 发布时间: 2022-05-12 共200人阅读

所有前台体系的集合链接: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还会执行吗?

发表回复