JavaScriptでは, ifの{}は省略できます.
if (a > 10) foo(); else bar(); hoge();
は
if (a > 10) { foo(); } else { bar(); } hoge();
と同じ.
ECMAScriptの定義では,
12 Statement Statement: Block ... 12.1 Block Block: { StatementList(optional) } StatementList: Statement StatementList Statement 12.5 The if Statement IfStatement: if ( Expression ) Statement else Statement if ( Expression ) Statement
みたいになってますね.
Statement → Block → {Statement Statement Statement Statement...}
よくある批判として, 上のhoge();が何処にあるのかというのがあります.
つまり,
if (a > 10)
foo();
bar();
は,
if (a > 10) { foo(); bar(); }
になるんじゃないよ!!! ってことですね.
はいはい. そうですね.
さてさて, 前の記事にこんなコードを貼り付けました.
function takeNext () { skipWhite(); if (text === '') return EOF; if (token(text)) return RegExp.$1; throw 'Unexpected token. \n'; }
エラーは長いのでちょっとカットしましたが, ここで, 上の意見とぶつかります.
「{}を書けよ! 読みにくいじゃないか!!!!!」
ここで主張します!
if ( Expression ) ReturnStatement; のパターンでは, {}を省略するほうが読みやすい.*1
今の時点では, 「returnする場合に限り」という意見です.
さっきのをきちんと書けば, こうなるの?
function takeNext () { skipWhite(); if (text === '') { return EOF; } else if (token.exec(text)) { return RegExp.$1; } else { throw 'Unexpected token. \n'; } }
こっちのほうが見やすい? どうだろうね?
もしかしたら, returnのせいなのかもしれない...
===================
少し話はずれるかもしれないけど, こんな考えが前から私の中にあるかも.
素早くreturnすべし returnすれば, その後のコードを読む必要なし.
function calc (text) { var _text = text; var digit = /^((?:(?:0|[1-9][0-9]*)(?:\.[0-9]*|)|\.[0-9]+)(?:[eE][+-]?[0-9]+)?)/, white = /^(\s+)/, ans = expr(); if (text) error(); return ans; function expr () { ...
calcがどんな関数なのかは6行読めば分かる.
もしreturnが最後にあったら?
function calc (text) { var _text = text; var digit = /^((?:(?:0|[1-9][0-9]*)(?:\.[0-9]*|)|\.[0-9]+)(?:[eE][+-]?[0-9]+)?)/, white = /^(\s+)/; function expr () { ... } function term () { ... } function fact () { ... } function num () { ... } function next (s) { ... } function skipWhite () { ... } function error (m) { ... } var ans = expr(); if (text) error(); return ans; }
どっちが分かりやすいか? 一目瞭然ですね.
素早くreturnすべし.
Chrome Player(まだこう呼んでる)のコードを引っ張ってくると, 同じ考えがちらほら見えてきました.
$(window) .keydown( function (e) { switch(e.keyCode) { case 9: key.tab(e); return; case 13: key.enter(e); return; case 27: key.esc(e); return; case 32: key.space(e); return; case 33: key.pgup(e); return; case 34: key.pgdn(e); return; case 35: key.end(e); return; case 36: key.home(e); return; case 37: key.left(e); return; case 38: key.up(e); return; case 39: key.right(e); return;
breakじゃなくてreturn使ってらぁーーー
returnすれば, この後を読む必要なし!!!!!
switch文の後に, 共通した処理が必要で, returnしちゃいけない「場合」があるとすれば, それはその書き方が悪い.
どうなんだろうね? こういう事って, 未来の自分とも意見が食い違う気がする.
*1:この意見は, この記事を書いた時点の私の見解であり, 一ヶ月後, もしかしたら一週間後には意見を変えるかもしれない.