Try/catchブロック内のreturnステートメントはどのように機能しますか?
function example() {
try {
return true;
}
finally {
return false;
}
}
この関数の出力はtrue
になると予想していますが、代わりにfalse
です!
最後にalwaysが実行されます。それが目的です。つまり、あなたの場合は戻り値が使用されます。
コードを次のように変更する必要があります。
function example() {
var returnState = false; // initialisation value is really up to the design
try {
returnState = true;
}
catch {
returnState = false;
}
finally {
return returnState;
}
}
一般的に言って、関数に複数のreturnステートメントを入れたくないのは、このようなことが理由です。
ECMA-262(5ed、2009年12月)によると、96ページ:
生産
TryStatement : try Block Finally
は次のように評価されます。
- Bをブロック評価の結果とします。
- Fを最終的に評価した結果とします。
- F.typeが正常な場合、Bを返します。
- Fを返します.
そして36ページから:
完了タイプは、制御の非ローカル転送を実行するステートメント(
break
、continue
、return
およびthrow
)の動作を説明するために使用されます。完了タイプの値は、(type、value、target)の形式のトリプルです。ここでtypeはnormal
、break
のいずれかです、continue
、return
、またはthrow
、値はECMAScript言語の値または空、およびターゲットは任意ECMAScript識別子または空。
return false
は、完了タイプfinallyをreturnとして設定し、try ... finally
実行4。Fを返す。
finally
を使用すると、メソッドが終了する前にそのブロック内のコードが起動します。 finally
ブロックでreturnを使用しているため、return false
を呼び出し、try
ブロック内の前のreturn true
をオーバーライドします。
(用語は正しくない場合があります。)
なぜfalseになるのかは、finallyブロックで返されるからです。最終的にブロックは常に実行する必要があります。 return true
はreturn false
に変更されます
function example() {
try {
return true;
}
catch {
return false;
}
}
私の知る限り、finally
ブロック内にreturn
ステートメントがあるかどうかに関係なく、try
ブロックalwaysが実行されます。エルゴ、finallyブロック内のreturn
ステートメントによって返される値を取得します。
これをFirefox 3.6.10とChrome 6.0.472.63の両方でUbuntuでテストしました。このコードは他のブラウザーでは異なる動作をする可能性があります。
Finallyブロックの書き換えは、ブロックリターンを試行します(具象的に言えば)。
最後に何かを返すと、それが関数から返されることを指摘したかっただけです。しかし、最終的に「戻り」Wordがない場合は、tryブロックから値が返されます。
function example() {
try {
return true;
}
finally {
console.log('finally')
}
}
console.log(example());
// -> finally
// -> true
-finally- return
は、-try- return
の戻り値を書き換えます。