【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()メソッドを使用するだけで、元の関数にキャッシュ機能を追加している。