参考にした記事が2007年と2008年のものなので、今では古いテクニックなのかもしれんけど…
最近、スマートフォン向けのサイトを作った。
PC向けと比べてネットワークが細いのと処理速度が遅いことを考えて、より高速化に対してシビアにならんといかん。
で、ボタンをクリックしたら、画面下からシュッとモーダルウインドウが出るような機能をつけた。
そのモーダルウィンドウ内でも、あれやこれやと機能がついてる。
でも、そのボタンは押されないかもしれないっていうサブ的な機能。
この機能の設定をJavaScript読み込み時にやっても使われなかったりする
なので、できればボタンがクリックされるまで、機能設定も動かないようにしていたい。
要は最初の1回だけ初期設定機能を付けて、2回目以降はそれを動かさないようにしたい。
パッと思いつくのが↓(ダメパターン)
var flag = false;
var kinou = function(){
  if(flag === false){
    //初期設定処理
    //フラグを切り替え
    flag = true;
  }
  //通常の処理
}
まあ、これでも動くんだけど、flagって変数が必要になるのと、関数呼び出すたびに条件判定をする必要がある。
こんなときには「Lazy Function Definition Pattern」
直訳すると「怠けた機能の定義様式」
var kinou = function(){
  //初期設定処理をここに書く
  //ここで関数上書き
  kinou = function(){
    //通常処理
  }
  //通常処理を起動
  kinou();
}
1度関数が呼ばれると、初期設定をする。
その後、関数内でその関数を上書き。初期設定機能はなくなって、通常機能のみの関数になる
2回目以降は、通常機能のみが動くようになる
「関数の外の変数を見にいかなくなる & 条件分岐がなくなる」より高速になるってことね。
「高速化」じゃなくて「早漏化」っていってみるととたんにやる気がなくなる。
参考:
JavaScriptの動作を軽くするための工夫
Lazy Function Definition Pattern(英文)
 
0 件のコメント:
コメントを投稿