2010-10-01 83 views
50

try/catch块中的return语句是如何工作的?Javascript:try/catch/finally return语句

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

我在期待这个函数的输出是“真”,而是它是“假”!

+1

您的问题文本和标题询问'try'/**'catch' **,但您的代码使用'finally'? – Bergi 2017-09-21 04:37:38

回答

53

最后总是执行。这就是它的目的,这意味着它的返回被用于你的情况。

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

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

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

+20

我认为拥有多个return语句并不总是很糟糕 - 请参阅http://stackoverflow.com/questions/36707/should-a-function-have只有一个回归陈述可供更多讨论。 – Castrohenge 2010-10-01 09:52:09

+3

+1好答案。不同意一个函数返回。 – 2010-10-01 10:07:33

+3

我对一个回报规则不太同意。你不应该从最后回来,虽然(在C#中,它甚至不允许)。 – erikkallen 2010-10-01 10:58:16

5

当您使用finally时,该块内的任何代码在该方法退出前触发。由于您在finally区块中使用了退货,因此它会调用return false并覆盖try区块中先前的return true

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

0

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

我在Ubuntu中对Firefox 3.6.10和Chrome 6.0.472.63进行了测试。该代码可能在其他浏览器中的行为有所不同。

3

为什么你得到错误是你在finally块中返回。 finally块应该总是执行。所以你return true更改return false

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

最后应该总是在一个try catch块结束时运行,这样(通过规范)就是为什么你越来越假返回。请记住,不同的浏览器具有不同的实现是完全可能的。

+0

IE8,Firefox 3.6和Chrome 6:都一样;) – bonfo 2010-10-01 09:47:59

20

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

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

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

而且从第36:

完成类型被用来解释语句的行为(break,continuereturnthrow)执行非局部控制转移。于完成类型的值的形式为(类型,值,目标),其中类型normal一个,breakcontinuereturn,或者throw的三元组是任何ECMAScript语言值或为空,并且目标是任何ECMAScript标识符或为空。

很明显,return false将设置最后回报,导致try ... finally4.返回˚F结束类型。

+0

这里最明确的答案 – 2018-02-27 05:00:09