他の言語と比べて特殊な仕様?であるわりに、入門的な書籍やサイトでも説明がなく、そのうえ既存のJavaScriptソースを読む際に頻出して分かりづらかった点です。
※ まだまだ初心者で学習中なので、補足や指摘があればコメントおねがいします!
即時関数
例
(function() {
console.log('hoge');
})();
-
(function(){..})()
の書き方は 即時関数 と呼ばれるので、この記述をブラウザが読んだ時点で、実行される。 - こういう書きかたをするメリット(いまの私の理解)
- 即時関数の内部で定義したローカル変数や関数を、即時関数の外部から隠蔽できる(グローバル汚染がされない)。
関数の書き方が2つある
パターン①
function hoge(){
console.log('hoge');
}
パターン②
var hoge = function(){
console.log('hoge');
};
- どちらも
hoge();
で実行できる。 - パターン②の方は 無名関数 。つまり関数名が定義されていない。
- こういう書きかたをするメリット(いまの私の理解)
- そもそも関数名を定義していないので、その関数名でのグローバル汚染がされない(関数名も変数)
- 一度しか使わない処理向け。なぜそれなのに関数化するのか、という疑問もあるかもしれないが、関数化すればまとまった処理が書け、且つ、内部で定義したローカル変数等をグローバルから隠蔽できる。
- こういう書きかたをするメリット(いまの私の理解)
関数自体がオブジェクトである
例えば次のような関数の定義があるとします。
function hoge(){ return "hoge"; }
違うらしい{..}
で囲ってる、つまり、オブジェクトである(いまの私の理解)。
なので、上記は 変数 hoge
というオブジェクトを定義している、と言い換えることができるかと思います。
なので、他の関数の引数としてオブジェクトを渡したり、また、次のように別の変数へ代入したりできます。
function hoge(){ return "hoge"; }
var hoge2 = hoge;
console.log(hoge2());
補足
↓ 下にコメントをくださってる内容の方が、正しい理解です^^;