目から鱗が落ちた JavaScript の即時関数パターンの使い方

JavaScript でよくやるおまじないの1つに、即時関数パターンがあります。こんなの。

(function(){

    // ... 何かする

})();

自分が書いたコードとライブラリの間で、名前が衝突するのを回避するときに使ってきました。

で、ついこの間、enchant.js のソースコードを読んでいたんですが

var VENDER_PREFIX = (function() {
    var ua = navigator.userAgent;
    if (ua.indexOf('Opera') != -1) {
        return 'O';
    } else if (ua.indexOf('MSIE') != -1) {
        return 'ms';
    } else if (ua.indexOf('WebKit') != -1) {
        return 'webkit';
    } else if (navigator.product == 'Gecko') {
        return 'Moz';
    } else {
        return '';
    }
})();

と書いている箇所を見て、目から鱗が落ちたというか、軽く衝撃を受けました。自分は名前衝突の回避にしか使ってこなかったことに。それ以外で使ってはいけない、なんてルールは無いのにね。

即時関数で返すのは値でなくちゃいけない、なんてルールも無いから

var getNextId = (function() {
    var _id = 0;
    var _getNextId = function() {
        return ++_id;
    };
    return _getNextId;
})();

とう風に、クロージャーを返すのもアリじゃないかな。enchant.js ではやってなかったけど。

この即時間数パターンの使い方は、JavaScript バリバリ書いている人にとっては、当たり前のテクニックなのかもしれません。自分の JavaScript スキルもまだまだというか、頭が凝り固まってるな、って思い知らされたのでついブログに書いてしまいました。