在try块中返回后,使用javascript finally块执行的顺序是什么

时间:2017-04-23 13:03:22

标签: javascript

关于: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错过了时间?

1 个答案:

答案 0 :(得分:1)

当您returntrycatch块中带有关联的finally块时,执行会进入finally块,因为这是它的目的:处理try / catch的常见完成操作。

在您的代码中,return发生的事情是:

  1. 从变量中读取test的值,并留出稍后使用。

  2. 控件转到finally

  3. finally中的代码更改了变量test的值(这对#1中留出的值没有影响)。

  4. 当遇到finally块的末尾时,函数返回,使用#1中的值作为返回值。

  5. 规范中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语句。