return文を2回実行すると上書きされる
JScriptで、tryまたはcatch内でreturnを実行した結果finallyのreturn文が実行されてしまう、と言う間抜けなことをやったので、同じことを繰り返さないために覚書。
- Code 1
var message = function(){ try{ return "try"; }catch(e){ /* エラー処理 */ }finally{ return "finally"; } }();
Code 1では、return "try";
が実行されたことにより処理がcatchから抜けることがトリガとなりfinallyが実行され、戻り値が "finally" になる。
実際に罠にはまったのは、try内で条件分岐し、returnが実行されたり、されなかったりするコードだったが、どちらの場合でもfinallyのreturnが最後に必ず実行されてしまうという間抜けなことに。なんと言うか、switch文でbreak書き忘れて、全部defaultになっちゃう、みたいな。
反省。
ちなみに、finallyが実行されるのはreturnの実行後なので、finallyで変数を変更しても問題ない。
- Code 2
var message = function(){ var temp = ""; try{ temp = "try"; return temp; }catch(e){ /* エラー処理 */ }finally{ temp = "finally"; } return temp; }();
Code 2の場合、try内のreturnによりfinallyに処理が移り、tempには "finally" が代入されるが、戻り値は "try" となる (それはそれとして、誤解を招くし、読みにくいのでどうかとは思いますが)。