読者です 読者をやめる 読者になる 読者になる

JavaScriptの関数

JavaScriptの関数にはfunction文とfunction式の二種類あります。

function文
別名、「関数宣言」です。
このように、function文はc++などでもお馴染みの関数宣言になります。
ただし、JavaScriptではコンパイル時に関数ができるので、関数宣言を呼び出した部分より下で宣言しても大丈夫です。

function hoge() {
  console.log('call hoge');
}

hoge();
fuga();

function fuga() {
  console.log('call fuga');
}

function式
別名、「関数式」です。
このようにfunction式はfunction文と違って式なので、実行されるときに関数が定義されるということです。

var hoge = function () { // 無名関数、匿名関数
  console.log('call hoge');
};

hoge();
try {
  fuga(); // この時点ではfugaはundefinedなので例外を吐く
} catch(e) { console.log('e'); }

var fuga = function Fuga() { // 関数に名前をつけることができる。再帰関数を書くときなどに利用可能
  console.log('call fuga');
};

(function () { // 即時関数
  // スコープを作るためのfunction式
})();

何が起きているのかを一つずつ説明。
JavaScriptの場合は、関数を変数的に見ることが可能です。
一つ目のfunction文は、無名関数を変数hogeに代入しており、その結果、hogeは関数になります。
ただし、代入文の実行時に関数が定義されるため、fuga()の呼び出しで例外が発生します。
またよく見ると、fugaのfunction式には無名関数ではなく、Fugaという名前が付いた関数であることに気づきます。
これはぱっと見意味はわからないかもしれませんが、関数「Fuga」の実態はただの関数オブジェクトになるので関数オブジェクト部分だけ関数「hoge」に代入しているような形です。
この場合、関数が「fuga」と「Fuga」二つ存在しているが、関数「Fuga」はローカルの関数となり、外で呼び出すことはできません。
これではメリットがないように思われますが、関数の中で自分自身を呼ぶ再帰関数を書くために使うことができます。
そして最後、何か()で括られているやつ。
こいつは即時関数と呼ばれるもの。
こいつは一度しか使用しない関数の時に用います。
つまり、スコープがそこだけになり、スコープの汚染を防ぐことができます。
つまり、これより前で宣言したグローバルスコープの変数の値を変えたりされないということです。