Ruby脳の人間が生のJSを学び直そうプロジェクト進行中。
今回は関数宣言についてあやふやだった部分をまとめた。
基本構文
オブジェクトとして定義する場合
function hoge () { 処理 }
ある程度のまとまりの処理をオブジェクトとして定義しておいて、いろんなところから呼び出したい場合はオブジェクト関数を定義する。
関数式として定義する場合(無名関数)
const hoge = function () { 処理 };
式として変数に代入する場合は関数名を省略できる。
これ多分今まで無意識にやってたんだろうけど、理屈きちんと分かっていなかった...!
これができるのは、JSの場合関数を丸ごと変数に代入することができるから。
function hoge() { 処理 } const fuga = hoge; fuga();
わざわざ別の名前に置き換えて呼び出すシーンがあるのか?という疑問は若干残るものの、
これにより関数式を定義するときはそのまま変数に関数の中身が入るので、関数名の定義を省略することができる。
ちなみに、仮に名前をつけたとしても、外からその関数名で呼び出すことはできない。
const hoge = function fuga() { 処理 }; fuga(); // => ReferenceError: fuga is not defined
ちなみに
JSの場合は関数の呼び出しの際に引数の数が一致していなくてもエラーにならない。
なんなら複数渡した関数を配列で受け取ることができたりする(Rest paramteres)。自由度高すぎて怖い(笑)
ただ、可読性に欠けるので実際に使われることはそんなにないそうです。