资讯专栏INFORMATION COLUMN

重学前端学习笔记(二十)--try里面放return,finally还会执行吗?

tolerious / 1838人阅读

摘要:二类型执行了但是没有立即返回,而是先执行了中的覆盖了中的。普通语句执行后,会得到为的,引擎遇到这样的,会继续执行下一条语句。控制类语句分成两部分对其内部造成影响如。

笔记说明
重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联系我,邮箱:kaimo313@foxmail.com。
一、引言
本文讲一讲 JavaScript 语句。

二、Completion 类型
// return 执行了但是没有立即返回,而是先执行了finally
function kaimo(){
  try{
    return 0;
  } catch(err) {
    console.log(err)
  } finally {
    console.log("a")
  }
}

console.log(kaimo()); // a 0
// finally 中的 return 覆盖了 try 中的 return。
function kaimo(){
  try{
    return 0;
  } catch(err) {
    console.log(err)
  } finally {
    return 1;
  }
}

console.log(kaimo()); // 1
2.1、Completion Record
Completion Record 用于描述异常、跳出等语句执行过程。表示一个语句执行完之后的结果,它有三个字段。

[[type]]:表示完成的类型,有 break、continue、return、throw、normal 几种类型

[[value]]:表示语句的返回值,如果语句没有,则是 empty

[[target]]:表示语句的目标,通常是一个 JavaScript 标签

JavaScript 使用 Completion Record 类型,控制语句执行的过程。

三、普通语句
JavaScript 中,把不带控制能力的语句称为普通语句。种类可以参考引言的图片。

1、这些语句在执行时,从前到后顺次执行(这里先忽略 var 和函数声明的预处理机制),没有任何分支或者重复执行逻辑。

2、普通语句执行后,会得到 [[type]]normalCompletion RecordJavaScript 引擎遇到这样的 Completion Record,会继续执行下一条语句。

3、在 Chrome 控制台输入一个表达式,可以得到结果,但是在前面加上 var,就变成了 undefinedChrome 控制台显示的正是语句的 Completion Record[[value]]

四、语句块
语句块就是拿大括号括起来的一组语句,它是一种语句的复合结构,可以嵌套。

语句块内部的语句的 Completion Record[[type]] 如果不为 normal,会打断语句块后续的语句执行。

1、内部为普通语句的一个语句块:

// 在每一行的注释中为 Completion Record
{
    var i = 1; // normal, empty, empty
    i ++; // normal, 1, empty
    console.log(i) //normal, undefined, empty
} // normal, undefined, empty

在这个block中都是 normal 类型的话,该程序会按顺序执行。

2、加入 return

// 在每一行的注释中为 Completion Record
{
  var i = 1; // normal, empty, empty
  return i; // return, 1, empty
  i ++;
  console.log(i)
} // return, 1, empty

block 中产生的非 normal 的完成类型可以穿透复杂的语句嵌套结构,产生控制效果。

五、控制型语句
控制型语句带有 if、switch 关键字,它们会对不同类型的 Completion Record 产生反应。

控制类语句分成两部分:

对其内部造成影响:如 if、switch、while/for、try

对外部造成影响:如 break、continue、return、throw

穿透就是去上一层的作用域或者控制语句找可以消费break,continue的执行环境,消费就是在这一层就执行了这个break或者continue

这两类语句的配合,会产生控制代码执行顺序和执行逻辑的效果。

六、带标签的语句

1、任何 JavaScript 语句是可以加标签的,在语句前加冒号即可

    firstStatement: var i = 1;

2、类似于注释,基本没有任何用处。唯一有作用的时候是:与完成记录类型中的 target 相配合,用于跳出多层循环。

    outer: while(true) {
        console.log("outer")
        inner: while(true) {
            console.log("inner1")
            break outer;
            console.log("inner2")
        }
    }
    console.log("finished")

    // outer  inner1  finished
个人总结

越看越发现自己菜鸡。。。_(:3」∠)_

看的懂的可以看看这个https://tc39.github.io/ecma262/#sec-runtime-semantics

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/109647.html

相关文章

  • 重学前端学习笔记二十)--try里面returnfinally还会执行

    摘要:二类型执行了但是没有立即返回,而是先执行了中的覆盖了中的。普通语句执行后,会得到为的,引擎遇到这样的,会继续执行下一条语句。控制类语句分成两部分对其内部造成影响如。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有wint...

    stonezhu 评论0 收藏0
  • 重学前端学习笔记二十)--try里面returnfinally还会执行

    摘要:二类型执行了但是没有立即返回,而是先执行了中的覆盖了中的。普通语句执行后,会得到为的,引擎遇到这样的,会继续执行下一条语句。控制类语句分成两部分对其内部造成影响如。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有wint...

    frontoldman 评论0 收藏0
  • 重学前端学习笔记二十七)--JavaScript的词法

    摘要:模板语法四种词法定义二空白符号空白符号分类或称是,是缩进符,字符串中写的。注意换行符会影响的两个重要语法特性自动插入分号和规则。 笔记说明 重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联系我,邮箱...

    jayzou 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<