try/catch塊中的return語句是如何工作的?Javascript:try/catch/finally return語句
function example() {
try {
return true;
}
finally {
return false;
}
}
我在期待這個函數的輸出是「真」,而是它是「假」!
try/catch塊中的return語句是如何工作的?Javascript:try/catch/finally 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語句的功能,這樣的事情是爲什麼。
我認爲擁有多個return語句並不總是很糟糕 - 請參閱http://stackoverflow.com/questions/36707/should-a-function-have只有一個迴歸陳述可供更多討論。 – Castrohenge 2010-10-01 09:52:09
+1好答案。不同意一個函數返回。 – 2010-10-01 10:07:33
我對一個回報規則不太同意。你不應該從最後回來,雖然(在C#中,它甚至不允許)。 – erikkallen 2010-10-01 10:58:16
當您使用finally
時,該塊內的任何代碼在該方法退出前觸發。由於您在finally
區塊中使用了退貨,因此它會調用return false
並覆蓋try
區塊中先前的return true
。
(術語可能不完全正確。)
據我所知,finally
塊總是執行,不論是否有內部try
或不return
聲明。 Ergo,你會得到return
語句在finally塊內返回的值。
我在Ubuntu中對Firefox 3.6.10和Chrome 6.0.472.63進行了測試。該代碼可能在其他瀏覽器中的行爲有所不同。
爲什麼你得到錯誤是你在finally塊中返回。 finally塊應該總是執行。所以你return true
更改return false
function example() {
try {
return true;
}
catch {
return false;
}
}
最後應該總是在一個try catch塊結束時運行,這樣(通過規範)就是爲什麼你越來越假返回。請記住,不同的瀏覽器具有不同的實現是完全可能的。
IE8,Firefox 3.6和Chrome 6:都一樣;) – bonfo 2010-10-01 09:47:59
根據ECMA-262(5ED,2009年12月),在第96:
生產
TryStatement : try Block Finally
如下評價:
- 令B爲評價塊的結果。
- 設F是最後評估的結果。
- 如果F.type是正常的,返回B.
- 返回F.
而且從第36:
完成類型被用來解釋語句的行爲(
break
,continue
,return
和throw
)執行非局部控制轉移。於完成類型的值的形式爲(類型,值,目標),其中類型是normal
一個,break
,continue
,return
,或者throw
,值的三元組是任何ECMAScript語言值或爲空,並且目標是任何ECMAScript標識符或爲空。
很明顯,return false
將設置最後爲回報,導致try ... finally
做4.返回˚F結束類型。
這裏最明確的答案 – 2018-02-27 05:00:09
您的問題文本和標題詢問'try'/**'catch' **,但您的代碼使用'finally'? – Bergi 2017-09-21 04:37:38