Javascript:try / catch返回语句

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

function example() { try { return true; } finally { return 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(5ed,2009年12月),pp.96:

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

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

从第36页:

Completiontypes用于解释执行非局部控制转移的语句( breakcontinuereturnthrow )的行为。 Completiontypes的值是表单(types,值,目标)的三元组,其中typenormalbreakcontinuereturnthrowvalue是任何ECMAScript语言值或空值, target是任何ECMAScript标识符或空。

很明显, return false会将finally的完成types设置为return ,这会导致try ... finally4.返回F。

当你finally使用时,该块内的任何代码在该方法退出之前触发。 因为你在finally块中使用了一个返回值,所以它会调用return false并覆盖try块中的前一个return true

(术语可能不太对。)

为什么你得到错误,你是在最后一块返回。 最后块应该总是执行。 所以你的return true变化return false

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

据我所知, finally总是执行,不pipe你是否在try内部有return语句。 Ergo,你会得到finally语句里的return语句返回的值。

我在Ubuntu中testing了Firefox 3.6.10和Chrome 6.0.472.63。 该代码可能在其他浏览器中performance不同。

最后应该总是在try catch块的末尾运行,这样(通过规范)就是为什么你得到错误的返回。 请记住,不同的浏览器完全有可能有不同的实现。