鉴于 test 函数,为什么首先执行 finally 代码中的代码而不是 try 块中的代码?如果是这样,变量 a 的新值为5(来自第9行),然后应该有一个新值8(来自第4行)。但它没有, a 的值是6.不知何故只有日志是从 finally 块执行的,并且分配被忽略了?在 try-catch 块中使用 return 是一种不好的做法?我看到,在许多流行的框架中,catch和finally块都缺少 return 语句。
1 function test () {
2 window['a'] = 3;
3 try {
4 window['a'] += 3;
5 return window['a'];
6 }
7 catch(e) {}
8 finally {
9 window['a'] = 5;
10 console.log('finally');
11 }
12 }
13
14 console.log(test());
段:
function test() {
window['a'] = 3;
try {
window['a'] += 3;
return window['a'];
} catch (e) {} finally {
window['a'] = 5;
console.log('finally');
}
}
console.log(test());
预期输出
6
最后
执行输出
最后
6
答案 0 :(得分:1)
执行顺序为TRY,然后是CATCH,然后是FINALLY(照例)。
您正在返回try块中的值,这就是您输出该值的原因。
执行try块,然后执行最后一个(因为没有错误),并记录您的消息,然后返回函数结果。
如果你把console.log(window ['a'])而不是return,你会看到你的预期输出。
答案 1 :(得分:1)
在正常执行过程中,finally
块保证在try
块后执行。如果在try
块中抛出异常,则顺序为try - > catch - >最后。在你的代码中,即使我们有一个return语句作为try块中的最后一行,finally块也会在退出方法之前执行。
如果当前线程在try块仍在运行时被终止,那么finally
块将不会被执行的示例。
编辑:来自ECMAScript 2015语言规范部分13.15.8:
TryStatement : try Block Finally
Let B be the result of evaluating Block.
Let F be the result of evaluating Finally.
If F.[[type]] is normal, let F be B.
If F.[[type]] is return, or F.[[type]] is throw, return Completion(F).
If F.[[value]] is not empty, return Completion(F).
Return Completion{[[type]]: F.[[type]], [[value]]: undefined, [[target]]: F.[[target]]}.
因此,如果finally
块正常执行,try-finally
块的结果保持不变。这就是finally
块仅应用于清理任务的原因,它不应包含任何业务逻辑。