在JS的try块中有一个return语句时,finally块的执行顺序是什么?

6 浏览
0 Comments

在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错过了时机?

admin 更改状态以发布 2023年5月21日
0
0 Comments

展示@user1106925的评论,他表示使用Javascript对象而不是原始类型会产生OP期望的行为。

function lessConfusion(){
  var result = {test: "a"};
  try{
    return result;
  }
  finally{
    result.test = "b";
  }
}
console.log("result", lessConfusion()); //result.test="b"

0
0 Comments

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

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

  1. 从变量中读取test的值,并将其保留以备后用。

  2. 控制权转移到finally

  3. finally中的代码更改变量test的值(对于第1步中设置的值没有任何影响)。

  4. 当遇到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语句。

0