web-dev-qa-db-ja.com

「finally」の戻り値が「try」をオーバーライドするのはなぜですか?

Try/catchブロック内のreturnステートメントはどのように機能しますか?

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

この関数の出力はtrueになると予想していますが、代わりにfalseです!

77
bonfo

最後にalwaysが実行されます。それが目的です。つまり、あなたの場合は戻り値が使用されます。

コードを次のように変更する必要があります。

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

一般的に言って、関数に複数のreturnステートメントを入れたくないのは、このようなことが理由です。

80
annakata

ECMA-262(5ed、2009年12月)によると、96ページ:

生産 TryStatement : try Block Finallyは次のように評価されます。

  1. Bをブロック評価の結果とします。
  2. Fを最終的に評価した結果とします。
  3. F.typeが正常な場合、Bを返します。
  4. Fを返します.

そして36ページから:

完了タイプは、制御の非ローカル転送を実行するステートメント(breakcontinuereturnおよびthrow)の動作を説明するために使用されます。完了タイプの値は、(type、value、target)の形式のトリプルです。ここでtypenormalbreakのいずれかです、continuereturn、またはthrowはECMAScript言語の値または空、およびターゲットは任意ECMAScript識別子または空。

return falseは、完了タイプfinallyreturnとして設定し、try ... finally実行4。Fを返す

33
livibetter

finallyを使用すると、メソッドが終了する前にそのブロック内のコードが起動します。 finallyブロックでreturnを使用しているため、return falseを呼び出し、tryブロック内の前のreturn trueをオーバーライドします。

(用語は正しくない場合があります。)

12
djdd87

なぜfalseになるのかは、finallyブロックで返されるからです。最終的にブロックは常に実行する必要があります。 return truereturn falseに変更されます

function example() {
    try {
        return true;
    }
    catch {
        return false;
    }
}
3
anishMarokey

私の知る限り、finallyブロック内にreturnステートメントがあるかどうかに関係なく、tryブロックalwaysが実行されます。エルゴ、finallyブロック内のreturnステートメントによって返される値を取得します。

これをFirefox 3.6.10とChrome 6.0.472.63の両方でUbuntuでテストしました。このコードは他のブラウザーでは異なる動作をする可能性があります。

1
Manoj Govindan

Finallyブロックの書き換えは、ブロックリターンを試行します(具象的に言えば)。

最後に何かを返すと、それが関数から返されることを指摘したかっただけです。しかし、最終的に「戻り」Wordがない場合は、tryブロックから値が返されます。

function example() {
    try {
        return true;
    }
    finally {
       console.log('finally')
    }
}
console.log(example());
// -> finally
// -> true

-finally- returnは、-try- returnの戻り値を書き換えます。

1
Mihey Mik