web之路让前端飞程序员

【十四】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,用于描述异常、跳出等语句执行过程。

它表示一个语句执行完之后的结果,它有三个字段:

先来一张语句的分类图


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关键字,分为两类

我们需要控制语句跟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还会执行吗?

上一篇下一篇

猜你喜欢

热点阅读