2010-10-01 99 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