ほくそ笑む

R言語と統計解析について

JavaScript の即時関数パターンはどんなときに使うのか?

知ってて当然?初級者のためのJavaScriptで使う即時関数(function(){...})()の全て
この記事長すぎ。。。

即時関数パターン

JavaScript では、

(function() {
    // なんらかの処理
})();

と書くことで、なんらかの処理をその場で実行できます。これを即時関数パターンと呼ぶそうです。

どういうときに使うの?

ブロックスコープを疑似的に作りたいときに使います。
JavaScript では、ブロックの外と中でスコープが同じです。
どういうことかというと、

var message = "hoge";
if(message === "hoge") {
    var message = "fuga";
    alert(message); // fuga と表示される
}
alert(message); // fuga と表示される

if(){} ブロックの中で var message を再定義しているにも関わらず、ブロックの外の message が書き変わっています。
これはブロックの中と外で変数のスコープ(有効範囲)が同じだからです。
たまにこれが原因でプログラムが変な動きになったりします。
これを避けたい場合に、即時関数パターンを使います。

var message = "hoge";
if(message === "hoge") {
    (function() {
        var message = "fuga";
        alert(message); // fuga と表示される
    })();
}
alert(message); // hoge と表示される

JavaScript では関数内のスコープは別になるので、即時関数パターンを使用すると関数内で定義した変数は関数内でのみ有効になります。
つまり、疑似的にブロックスコープを作ったということになります。

まとめ

即時関数パターンは、ブロックスコープの無い JavaScript で、疑似的にブロックスコープを作るために使用します。
グローバルスコープを汚さないというのも、同じ理屈です。
個人的には「即時関数」という呼び名ではこの使用方法をイメージしにくいので「疑似ブロック」とか「似非ブロック」とかでいいと思います。