Skip to content

Instantly share code, notes, and snippets.

@os0x
Created April 8, 2010 15:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save os0x/360183 to your computer and use it in GitHub Desktop.
Save os0x/360183 to your computer and use it in GitHub Desktop.
(function(){
// ある関数について、最初に呼び出されたときと2回目以降で処理を分ける方法
// 自分自身を書き換える関数
// 初期化コストが低いが、見た目がイマイチ
// 関数宣言でなくても良いが、関数宣言なら定義する場所を気にしなくて良くなる
function A(){
A = _A;
/*一回目の処理*/
// _A.apply(this,arguments);//2回目の処理を呼ぶこともOK
function _A(){
/*2回目以降*/
}
}
// 無名関数を使う方が一般的
// 慣れるとわかりやすい。この処理が実行されるまでBは未定義なので、定義位置に注意
var B = (function () {
var e = false;
return function () {
e = true;
};
})();
// 関数自身にフラグをつける
// ある意味わかりやすいが、(フラグが外から見えるところが)スマートじゃない(気がする、これはこれで便利だけど)
function C() {
if (C.inited){
// 2回目以降
} else {
C.inited = true;
}
}
// http://twitter.com/taiju/statuses/11830741960
// window(グローバルオブジェクト)に関数を登録
// Bとほぼ同じだが、Dは関数が定義されたスコープに関わらずDがグローバル変数になる
(function(){
var e = false;
window.D = function() {
e = true;
}
})();
})();
alert(typeof D === 'function');// Dのみtrue、A、B、Cはundefined
/*
ちなみにどのパターンでもパフォーマンスはほとんど変わらないはず。
何10万回と繰り返せば差は出てくるかもしれないが、
エンジンによって差が出ることもあるので一概にどれが良いとは言えない。
そもそも体感的な差にはならないので、好みで選ぶのが良い
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment