JavaScriptの無名関数の使い方

関数は一連の処理のまとまりに名前をつけて再利用できるようにしたものです。しかし、その場限りで使い捨てる場合にはわざわざ名前を付ける必要はありません。

このように、一度きりしか使われない関数のことを、「無名関数」あるいは「匿名関数」と呼びます。

以下では、無名関数の書き方と注意点、及び即時関数について説明します。

無名関数の書き方

関数を再利用するためには関数名をつけますが、再利用する必要がないその場限りの使い捨て関数に名前を付けるのはリソースの無駄遣いであるとともに、名前の衝突を引き起こす可能性があります。

そこで、そのような場合には無名関数を使います。

コールバック関数として使う

次の例はsetTimeout()を使って10秒後にアラートを表示するプログラムです。まずは、無名関数を使わないコードを見てみましょう。

function alarm(){
    alert("10秒経過");
}
setTimeout(alarm, 10000);  //10000ミリ秒後に関数alarmを呼ぶ

しかし、ここで定義した関数alarm()を再利用する必要がない場合、無名関数を使って次のように記述することができます。

setTimeout(function(){
    alert("10秒経過");
}, 10000);

このように、無名関数は関数の引数に指定することで、コールバック関数としてよく使われます。

オブジェクトのメソッドとして使う

また、次のようにオブジェクトのプロパティにメソッドを登録する際にも無名関数を使います。

以下は、objオブジェクトにprop_sayHelloというメソッドを追加する例です。

var obj = {
    prop_sayHello: function(){  //プロパティにメソッドを登録する
        alert("Hello!");
    }
};

無名関数を使う際の注意点

無名関数は関数名を省略することができますが、次のように文頭から始めることはできません。なぜなら、functionから始まる文は関数の宣言文として解釈され、宣言文ではfunctionの後ろに必ず関数名が必要となるからです。

//エラー(関数名が必要)
function(){};

このような時は、次で説明する即時関数を使います。

即時関数の書き方

無名関数はその場で実行させることができ、このような関数を即時関数と呼びます。

上記のように、無名関数は文頭に記述することができないので、まず()で関数全体を囲います。この括弧は演算の優先順位を決めるためのもので、プログラムの実行には影響しません。

その上で、即時実行させるために後ろに()を付けます。

//Helloを表示する即時関数
(function(){
    alert("Hello");
})();

また、関数なので当然引数を渡すこともできます。

(function(a,b){
    alert(a + b);
})(2, 3);