finally语句块的返回值
如果finally语句块中有返回值,那么这个值将作为整个try…catch语句的返回,无论try语句块或者catch语句块中是否有返回,这包括了catch中的异常。
finally真正的执行时机是:try(或catch)中 return关键字之前。
function justLog(){
console.log('来自justLog的打印');
return '来自justLog的return'
}
function fn() {
try {
console.log('try块内log');
return justLog(); // <=== 这次我们return了一个函数
} catch (error) {
console.log('catch块内log');
return 'catch中的return语句';
} finally {
console.log('finally块内log====');
return 'finaly中的return';
}
return '一般情况下的return';
}
console.log(fn());
可以看到,红框内为justLog函数的log,红框下面是finally中的打印和返回。
所以finally真正的执行时机是:try(或catch)中 return关键字之前。
所以我们才看到了justLog中的打印
应用场景
function hoc(fn) {
return fn()
}
我们想要返回所传递参数的执行结果,这样做是没问题的。
那如果我们想在函数执行之后,return之前,做一些其他操作,应该怎么做呢?
function hoc(fn){
const res = fn()
//其他的操作
return res
}
很简答,我们可以先获取返回值,再进行其他操作,然后return。
不过这样我们就占用了额外的空间,而且无法便利的复用return后的语句,这个时候,我们的try…catch就可以排上用场了:
function hoc(fn){
try{
return fn()
} finally{
//一些其他操作 这些操作会在 fn()执行之后 return 执行前执行
}
}
finally语句块会在try(或catch)中的 return 关键字之前执行