JavaScriptの動かないコード (初級編) 関数が返り値を return できないエラー (セミコロンの罠)
以下のJavaScriptコードが意図した動作をしないのは,なぜですか。(制限時間1分)
やりたい事:
- 現在時刻を表示する。
<input type="button" onclick="f()" value="現在時刻を表示"> <script language="JavaScript"> function f(){ alert( getNow() ); } // 現在時刻の文字列を返します。 function getNow(){ var d = new Date(); // 1:23:45 のような形式 return d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds() ; } </script>
答え
getNow()の中のコードは,+ を使って変数どうしを文字列として連結している。
連結する要素が多いので,見やすくするつもりで,たくさん改行してある。
それが仇になる。
ECMAスクリプトの仕様書
http://www2u.biglobe.ne.jp/~oz-07ams/...
7.9 自動セミコロン挿入 (Automatic Semicolon Insertion)
「空文 (empty statement),
変数文 (variable statement),
式文 (expression statement),
do-while 文 (do-while statement),
continue 文 (continue statement),
break 文 (break statement),
return 文 (return statement),
throw 文 (throw statement))はセミコロンで終了しなければならない。
そのようなセミコロンは、ソーステキスト内に常に明示的に出現してよい。しかしながら、簡単にするために、ある位置ではソーステキストからセミコロンを省略してよい。
この位置は、それらの位置のソースコードトークンのストリームにセミコロンが自動的に挿入されるという言葉で説明される。」
なんと「自動セミコロン挿入」という規則があり,return のあとに改行すると,そこにセミコロンが入って文が終わってしまう。
return a;
を,よかれと思って
return a;
と書いてはいけないのだ。この場合
return; a;
と同じ意味になってしまい,戻り値は何もない。
参考:
JavaScriptは改行で動作が変わる
http://it.kndb.jp/entry/show/id/440【JavaScript】自動セミコロン挿入とドット演算子など
http://jsgt.org/mt/archives/01/001701...
return の直後だけ気を付ければいいので,例えば
return d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds() ;
のように改行を入れるのはOK。