memoize() | Underscore JS 日本語リファレンス

一度計算した値をキャッシュする機能を引数(関数)に付け加える関数。

■使用例

var obj = [ 
    { 
        title : "悪魔城ドラキュラX 月下の夜想曲", 
        year : 1994,
        author : "Michiru Yamane"
    },
    { 
        title : "Final Fantasy5 Original SoundTrack", 
        year : 1992, 
        author : "Nobuo Uematu"
    }, 
    { 
        title : "Final Fantasy4 Original SoundTrack", 
        year : 1991, 
        author : "Nobuo Uematu"
    }, 
    { 
        title : "Final Fantasy6 Original SoundTrack", 
        year : 1992, 
        author : "Nobuo Uematu"
    }
];
var pre = { author : "Michiru Yamane" };
var func = function( key ){
	return _.where( obj, key );
}
var memo = _.memoize( func );

// re =[ {"title":"悪魔城ドラキュラX 月下の夜想曲","year":1994,"author":"Michiru Yamane"} ];
var re = func( pre );

// re2 =[ {"title":"悪魔城ドラキュラX 月下の夜想曲","year":1994,"author":"Michiru Yamane"} ];
var re2 = memo( pre );
obj.shift();

// re3 = [];
var re3 = func( pre );

// re4 =[ {"title":"悪魔城ドラキュラX 月下の夜想曲","year":1994,"author":"Michiru Yamane"} ];
var re4 = memo( pre );

■内部構造

  _.memoize = function(func, hasher) {
  	
// 最後に返されるmemoize関数定義。
    var memoize = function(key) {
      var cache = memoize.cache;

// hasher が「undefined」なら address = key;
// this = window;
      var address = "" + (hasher ? hasher.apply(this, arguments) : key);
      
// cache Object に address のプロパティがなかったら値の結果をキャッシュする。
      if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
      
// 結果を返す。     
      return cache[address];
    };

// 空Object設定。
    memoize.cache = {};

// _.memoize() は部分適用された memoize関数が返される。
    return memoize;
  };

このページのトップへ戻る