理系公務員のプログラミング日記

【JS忍者】関数のメモ化について②

タグ:
JavaScript

続き

オブジェクト指向にあるプライベート変数とかオーバーライドとかカプセル化をクロージャを使って実現しようとしているらしい。 JavaScriptって引数に型の宣言がないことに読みにくいなー。動的片付け言語なので仕方ないんやけど。

クロージャを使って関数をメモ化する

P.119 4.5.1 メモ化 より

素数を判定するプログラムに、クロージャを用いて過去に計算した内容を覚えさせる(キャッシュ)の機能を追加する。

// プロトタイプを使えば、全ての関数にメソッドを追加できる Function.prototype.memorized = function(key){ this._values = this._values || {}; return this._value[key] !== undefined ? this._value[key] : this._value[key] = this.apply(this,arguments); }; Function.prototype.memorize = function(){ // 呼び出しコンテクストをクロージャに代入するため、変数に代入する let fn = this; // 元の関数をメモ化関数でラップする return function(){ // プロトタイプで追加したメソッド return fn.memorized.apply( fn, arguments ) } } let isPrime = (function(num){ let prime = num != 1; for (let i = 2; i < num; i++){ if (num % i == 0){ prime = false; break; } } return prime; }).memorize();

memorize()メソッドを使用するだけで、元の関数にキャッシュ機能を追加している。