概要
javascriptの関数の書き方としてメモ化(Memoization)というものがあります。
これはjavascriptのみならず、他の言語でも同じ概念で書くことができます。
ざっと調べると「関数のサブルーチンの呼び出し結果を後で再利用する為に保持し、そのサブルーチンの呼び出し毎の再計算を防ぐ手法」ということが言えます。
この保持する部分を「オブジェクトに記憶」や「キャッシュしておく」という言い方に変えればイメージがつきやすくなるかもしれません。
サンプル
簡単な例を書いてみました。
// 関数定義
let testfunc = function(n) {
let memo;
// キャッシュのキーに値があるかどうか
if (testfunc.cache[n]) {
// キャッシュ内にある場合は、既にメモ化された結果を返す
return testfunc.cache[n];
} else {
// 引数を基にキャッシュから読み込み
memo = {};
// 仮の演算を行う(時間がかかる処理にする)
for (i = 0; i < 100000; i++) {
memo[i] = i * n * 2;
}
// 演算結果をメモ化したキャッシュに格納
testfunc.cache[n] = memo;
return testfunc.cache[n];
}
};
// メモ化した関数のキャッシュ領域を用意
testfunc.cache = {};
上記の関数定義と、その後キャッシュ領域の用意(初期化)を行うことにより、
初回の関数呼び出しのみ、時間のかかる処理が呼び出され、その後の呼び出し時には、一度演算したことがある引数についてはキャッシュから値を読み込んで値を返す動作になります。