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
评估如下:
- 设B是评估Block的结果。
- 设F是最后评价的结果。
- 如果F.type是正常的,则返回B.
- 返回F.
从第36页:
Completiontypes用于解释执行非局部控制转移的语句(
break
,continue
,return
和throw
)的行为。 Completiontypes的值是表单(types,值,目标)的三元组,其中type是normal
,break
,continue
,return
或throw
, value是任何ECMAScript语言值或空值, target是任何ECMAScript标识符或空。
很明显, return false
会将finally的完成types设置为return ,这会导致try ... finally
做4.返回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块的末尾运行,这样(通过规范)就是为什么你得到错误的返回。 请记住,不同的浏览器完全有可能有不同的实现。