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

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

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

有帮助吗?

解决方案

最后总是执行。这就是它的,这意味着它的收益获取你的情况下使用。

您会想改变你的代码,所以它更像是这样的:

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

一般来说你永远不希望有一个以上的return语句的功能,这样的事情是为什么。

其他提示

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

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

  1. 令 B 为评估 Block 的结果。
  2. 令 F 为 Final 评估的结果。
  3. 如果F.type正常,则返回B。
  4. 返回F。

并从页。36:

Completion 类型用于解释语句的行为(break, continue, returnthrow)执行非本地控制转移。Completion 类型的值是以下形式的三元组 (类型、值、目标), , 在哪里 类型 是其中之一 normal, break, continue, return, , 或者 throw, 价值 是任何 ECMAScript 语言值或空,并且 目标 是任何 ECMAScript 标识符或为空。

很明显 return false 将设置完成类型 最后 作为 返回, ,这导致 try ... finally 去做 4.返回F.

当您使用finally,该方法退出之前该块内的火灾的任何代码。因为你使用的finally块一回,它调用return false并覆盖在return true块以前try

(术语可能不完全正确。)

为什么你得到虚假的是你在finally块返回。 finally块应始终执行。所以你return true变为return false

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

据我所知,finally块的总是执行,不论是否有内部return或不try声明。人机工程学,你在return语句返回内部finally块的价值。

我与Firefox 3.6.10和Chrome 6.0.472.63都在Ubuntu测试此。这可能是该代码可以表现不同的其他浏览器。

在最后块的重写尝试块返回(形象地说)。

只是想指出的是,如果你从最后返回的东西,然后将它从函数返回。但如果最后没有“回归”这个词 - 这将返回从try块的价值;

function example() {
    try {
        return true;
    }
    finally {
       console.log('finally')
    }
}
console.log(example());
// -> finally
// -> true

所以-finally- return重写-try- return的返回。

最后应该始终运行在一个try catch块的末尾,以便(通过规范)就是为什么你越来越假返回。请注意,这是完全可能的,不同的浏览器具有不同的实现。

这个是什么?

doubleReturn();

function doubleReturn() {
  let sex = 'boy';

  try {
    return sex;

    console.log('this never gets called...');
  } catch (e) {} finally {
    sex = 'girl'; 

    alert(sex);
  }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top