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 スキルもまだまだというか、頭が凝り固まってるな、って思い知らされたのでついブログに書いてしまいました。