在JS的try块中有一个return语句时,finally块的执行顺序是什么?
在JS的try块中有一个return语句时,finally块的执行顺序是什么?
关于:Java try-finally return design question
这个问题并没有完全回答我的问题,也可能不相关,因为它是关于Java而不是JavaScript的:What is the order of execution in try,catch and finally
我理解在finally
块中放置一个return
会优先于在catch
块中放置一个return
,但是下面的代码中事件序列是如何工作的呢?
function confusion(){ var test = "a"; try{ return test; } finally{ test = "b"; } } console.log("Result", confusion()); //"a"
我对任何返回的一般了解是控制通常会返回到调用该方法的上下文中,所以执行仍然继续有些令人困惑。
在这种情况下,我认为会发生以下情况:
-函数设置为返回test
-> finally
更改test
的值 -> 使用更新后的值返回test
。
但实际上似乎在try
块中保持了某种状态,所以finally
错过了时机?
当您从带有关联finally
块的try
或catch
块中return
时,执行进入finally
块,因为这是它的目的:处理完成try
/ catch
的常见操作。
在您的代码中,return
发生的情况是:
-
从变量中读取
test
的值,并将其保留以备后用。 -
控制权转移到
finally
。 -
finally
中的代码更改变量test
的值(对于第1步中设置的值没有任何影响)。 -
当遇到
finally
块的末尾时,函数返回,使用在第1步中保存的值作为其返回值。
这在规范中的The try
Statement / Runtime Semantics: Evaluation中有所涵盖,并且在MDN上的try...catch
中可能更易于阅读,“finally”子句。
请注意,finally
可以通过抛出异常或返回新值来中断返回过程。 如果它执行这两个操作中的任何一个,它将胜过try
(或catch
)中的return
。
关于您链接的Java问题的副笔记:JavaScript的try
/ catch
/ finally
的工作方式与Java的相同,除了:1.您只能有一个catch
块,因为异常没有键入,2.JavaScript没有Java的try-with-resources
语句。