为什么“终于”中的返回会覆盖“尝试”?

try/catch 块中的 return 语句如何工作?

function example() {
    try {
        return true;
    }
    finally {
        return false;
    }
}

我期望这个函数的输出是,但相反它是!truefalse


答案 1

最后始终执行。这就是它的用途,这意味着它的返回值会在你的情况下使用。

您需要更改代码,使其更像这样:

function example() { 
    var returnState = false; // initialization value is really up to the design
    try { 
        returnState = true; 
    } 
    catch {
        returnState = false;
    }
    finally { 
        return returnState; 
    } 
} 

一般来说,你永远不希望在一个函数中有多个 return 语句,像这样的东西就是原因。


答案 2

根据ECMA-262(5ed,2009年12月),第96页:

生产评估如下:TryStatement : try Block Finally

  1. 设 B 是计算 Block 的结果。
  2. 设 F 为最终评估的结果。
  3. 如果 F.type 为正常,则返回 B。
  4. 返回 F。

从第36页开始:

完成类型用于解释执行非局部控制权转移的语句 (、 和 ) 的行为。完成类型的值是形式(类型、值、目标)的三元组,其中类型是 、、、或 之一,是任何 ECMAScript 语言值或空值,目标为任何 ECMAScript 标识符或空。breakcontinuereturnthrownormalbreakcontinuereturnthrow

很明显,会将完成类型设置为 final 作为返回,这会导致执行 4。返回 Freturn falsetry ... finally