关于:Java try-finally return design question
这不能完全回答我的问题也可能不相关,因为它是java而不是javascript:What is the order of execution in try,catch and finally
我理解在finally
块中返回优先级会优先于catch
块中的返回,但序列事件如何与以下代码一起使用?
function confusion(){
var test = "a";
try{
return test;
}
finally{
test = "b";
}
}
console.log("Result", confusion()); //"a"
我对返回任何内容的一般理解是控制通常会返回到调用方法的上下文,因此执行继续的事实让我感到困惑。
在这种情况下,我认为它可能会发挥:
- 功能设置为返回test
- > finally
更改test
- >的值返回test
并附上更新后的值。
但相反,似乎某种状态是为try
阻止并且finally
错过了时间?
答案 0 :(得分:1)
当您return
从try
或catch
块中带有关联的finally
块时,执行会进入finally
块,因为这是它的目的:处理try
/ catch
的常见完成操作。
在您的代码中,return
发生的事情是:
从变量中读取test
的值,并留出稍后使用。
控件转到finally
。
finally
中的代码更改了变量test
的值(这对#1中留出的值没有影响)。
当遇到finally
块的末尾时,函数返回,使用#1中的值作为返回值。
规范中The try
Statement / Runtime Semantics: Evaluation涵盖了这一点,“finally
子句下的try...catch
on MDN可能更容易理解。”
请注意,finally
可以通过抛出异常或返回新值来中断返回过程。如果它执行了其中任何一项操作,则会胜过return
(或try
)中的catch
。
Side Note是您的链接Java问题:JavaScript的try
/ catch
/ finally
就像Java一样工作,除了:1。您只能有一个catch
块,因为异常没有输入,2。JavaScript没有Java的try-with-resources
语句。