見出し画像

JavaScript初心者脱却計画②(関数の定義のしかた)

このnoteは、JavaScript初心者脱却を目指すものです。(前回投稿はこちら1歩進んで2歩下がる...という感じで勉強しているので、今回は少し基本に戻ります。

※メイン参考書は引き続き「ノンプログラマのためのJavaScriptはじめの一歩」ですが、ネットで調べて自分なりに咀嚼した内容が含まれるので、ツッコミ等あればお待ちしています(お手柔らかに...)。すごく遠回りに一歩一歩考察していますので、初心者でこう考える人もいるのか...ぐらいに思っていただければ。

1.関数の定義のしかた

勉強(Three.jsのチュートリアル)を進めていて、下記のコードが出てきました。

<script>
window.addEventListener('load', init);
function init(){
 // 処理
}
</script>

前回整理したことから考えると、これはaddEventListener()メソッドを使用していて、targetはwindow、typeはloadとなっています。ふむふむ。listener部分にinitとあります。initという処理の内訳はそのままその場に書くのではなく、一度外に出して、改めて処理の内容を書いてあります。

これを見て、私はこう思いました。

「あれ...?initという関数(または存在)について、まだ定義されていないのに使用されている。initという名前からしてinitialな感じがするし、あらかじめ用意されている関数なのかな?」

と。違います。上の記述にも含まれていますが、functionから始まる下記の部分こそが、関数の定義です。

function init(){
 // 処理
}

関数の定義については早い段階で学習する内容のはずですが、なぜ私は「まだ定義されていない」と思ってしまったのでしょうか??(汗)

JavaScriptで「定義」というと、var 〇〇 = xx; が思い浮かびます。または、let 〇〇...というパターンもあります。これはあくまで変数の定義なのですが、そのイメージに引っ張られていたのです。素人感丸出しの意見でお恥ずかしいですが、function 〇〇...って、なんとなく定義っぽくなくないですか? 定義というより、まさに今実行されているようなイメージです。(私だけ?)

2.関数を、変数に代入して定義する

ただ、この混乱には他にも原因がありました。関数の定義のしかたとして、こういう書き方もあるからです。

var init = function(){
 // 処理
};

これなら見た目も含め、定義っぽいです。これは、変数に代入することで、関数を定義しているのです。このように2種類の書き方があるので、var...という文字が入っていないと物足りない(定義っぽくない)ように思ってしまったのかもしれません。並べて比較してみましょう。

//一つめ

function init(){
 // 処理
}

//二つめ

var init = function(){
 // 処理
};

この二つは、書き方が違うだけでほぼ同じことです。(厳密には違うようですが...)

2.セミコロン問題

ここで、大変なことに気がつきます。「後ろのセミコロンが、あったりなかったりする」のです。どういうことかというと、関数をシンプルに定義しているもの(function文)にはセミコロンがないのに、変数に代入しているもの(function式)はセミコロンありです。関数の終わりはセミコロンなしで良いはずなのですが...。(混乱)

調べたところ、演算子を用いた式はセミコロン必要、ブロックを利用する制御構文(if,forなど)にはセミコロン不要ということのようでした。変数に代入しているもの(function式)は、演算子を用いた式に該当するので、セミコロンが必要だったのです。内心、どちらかに統一してくれたらいいなぁと思っていたのですが、明確なルールに乗っ取って決められているのなら、覚えて慣れるしかないですね。

また、関数の定義の仕方にはもう一つ、オブジェクトのプロパティとして定義するという方法もあります。この方法はよく使うみたいなのですが、(個人的に)今やりたい内容に直接関わってないので、また別の機会にします。

今回は以上です!

この記事が気に入ったらサポートをしてみませんか?