你(可能)不知道的系列,经典的you-dont-know-js读书笔记。
综述
在finally
分支的代码,无论如何都将被执行,并且是在try
catch
(如果有的话)完成后,在其他代码运行之前,立即执行。
在某种意义上,我们可以将在finally
分支中的代码想象为一个回调函数,不管其他部分如何,这个回调函数总是会被执行。
特殊情况
上面综述大家一般都知道,但是在特殊情况下的执行流程呢?
这里指的特殊情况是指,存在改变函数执行流程的语句,比如
return
throw
等。
在try
分支中有return
如果在try
分支中有return
语句的话,会怎么样呢?显然最后函数还是要返回一个值的。问题是:fianlly
分支中的代码何时执行?
|
|
首先return 42
会被立即的执行,它的作用是设置了调用foo()
得到的返回值(注意:并没有结束函数执行)。这个动作结束了try
分支,然后finally
分支会立即接着执行,finally
分支执行完后,foo()
函数调用才算完成。所以42
会被作为返回值给console.log(...)
使用,最后打印出42。
在try
分支中有throw
对于try
中的throw
语句,是同样的流程:
|
|
在finally
分支中有throw
现在,如果在finally
内部被抛出了一个异常(意外的或者故意的)的话,将会直接结束整个函数,同时如果在try
分支中有return xxx
语句设置了返回值,这个值将会被抛弃:
|
|
在finally
分支有return
在finally
中显示调用return
语句的话,可以重写try
或者catch
分支中的return
语句:
|
|
正常来说,如果函数中省略了return
语句,那么最后的返回值将是undefined
,但是在finally
块中, 省略return
并不等同于return undefined
,如果没有return
,则仅仅就是让前面的return
生效。