Created
April 8, 2010 15:28
-
-
Save os0x/360183 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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