一度計算した値をキャッシュする機能を引数(関数)に付け加える関数。
■使用例
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;
};