2010-10-01 9 views
50

Jak działa instrukcja return wewnątrz bloku try/catch?Javascript: try/catch/finally return statement

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

Oczekuję, że wyjście tej funkcji będzie "prawdziwe", ale zamiast tego jest "fałszywe"!

+1

Twój tekst i tytuł pytania pytają o 'try'/**' catch' **, ale twój kod używa 'finally'? – Bergi

Odpowiedz

53

Wreszcie zawsze wykonuje się. Po to jest to, co oznacza, że ​​powrót jest używany w twoim przypadku.

Będziemy chcieli, aby zmienić swój kod, więc jest to bardziej jak to:

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

Generalnie nigdy nie chce mieć więcej niż jedno oświadczenie return w funkcji, takie rzeczy to dlaczego.

+20

Twierdzę, że więcej niż jedno oświadczenie zwrotne nie zawsze jest złe - Zobacz http://stackoverflow.com/questions/36707/should-a-function-have -tylko-jeden-return-oświadczenie dla większej dyskusji. – Castrohenge

+3

+1 dobra odpowiedź. nie zgadzam się na jeden powrót w funkcji. –

+3

Ja też nie zgadzam się co do zasady jednego powrotu. Jednak nigdy nie powinieneś wracać (w języku C# to nie jest dozwolone). – erikkallen

5

Podczas korzystania z finally, dowolny kod w tym bloku zostanie uruchomiony przed zakończeniem metody. Ponieważ używasz zwrotu w bloku finally, wywołuje on return false i zastępuje poprzedni return true w bloku.

(terminologia może nie być całkiem w porządku.)

0

O ile mi wiadomo, finally blokowe zawsze Wykonuje, niezależnie od tego, czy masz return oświadczenie wewnątrz try czy nie. Ergo, otrzymasz wartość zwróconą przez instrukcję return wewnątrz bloku finally.

Testowałem to w Firefoksie 3.6.10 i Chrome 6.0.472.63 zarówno w systemie Ubuntu. Możliwe, że ten kod może działać inaczej w innych przeglądarkach.

3

dlaczego otrzymujesz fałsz, wróciłeś w bloku finally. w końcu blok powinien być zawsze wykonywany. dzięki czemu return true zmiany return false

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

Wreszcie ma zawsze uruchamiane na końcu bloku try catch tak że (według specyfikacji) Dlatego otrzymujesz fałszywe zwrócone. Pamiętaj, że jest całkiem możliwe, że różne przeglądarki mają różne implementacje.

+0

IE8, Firefox 3.6 i Chrome 6: wszystkie takie same;) – bonfo

20

Według ECMA-262 (5ED, grudzień 2009), w pkt 96.

Produkcja TryStatement : try Block Finally oceniana jest następująco:

  1. Niech B będzie wynikiem oceny blok.
  2. Niech F będzie wynikiem oceny Ostatecznie.
  3. Jeśli F.type jest normalne, powrót B.
  4. Powrót F.

iz pp. 36:

Typ Zakończenie służy do wyjaśnienia zachowania sprawozdania (break, continue, return i throw), które wykonują nielokalne transfery kontroli.Wartości rodzaju budowy są trójki postaci (typ, wartości docelowej), gdzie typu jest jednym normal, break, continue, return lub throw, wartości jest dowolna wartość język ECMAScript lub pusty i target to dowolny identyfikator ECMAScript lub pusty.

To jasne, że return false by ustawić typ zaawansowania wreszcie jako zamian, które powodują try ... finally zrobić 4. Zwrot F.

+0

najbardziej przejrzysta odpowiedź tutaj –