1
我知道一些通用記憶方法依賴於將參數列表串化並將其用作關鍵字。例如。如:Javascript中的通用記憶方法
Function.prototype.memoized = function() {
this._values = this.values || {};
var fn = this;
return function() {
var key = JSON.stringify(Array.prototype.slice.call(arguments));
if (fn._values[key]===undefined) {
fn._values[key]=fn.apply(this, arguments);
}
return fn._values[key];
};
};
當一個人試圖memoize的一個「成員函數」,因爲一個人必須要還的JSON字符串化的背景下爲好,即把它當作一個隱式傳遞參數,這顯然會失敗。但是,如果上下文是全局對象或者同等深度的東西,或者以與函數本身無關的各種方式進行更改,那麼這種方法就不會奏效。
但即使我們堅持非「成員函數」,它可能並不總是可能完成strigify傳遞的參數列表,對吧?
三個問題:
- 做我理解正確的話,在一個通用的方法memoizing成員函數是無意義的?
- 我是否正確地理解,以通用方式記憶甚至非成員函數也是不可能的,因爲無法/不切實際地將任何可想象的參數列表完全串化?
- 如果2成立,那麼爲什麼很多書籍和博客都試圖在Function.prototype中定義一個通用的
memoize
函數?重點是什麼?
你是什麼意思「stringify the context」?如果你的意思是對象的狀態,那麼它是非感性的。記事特別針對論點。 –
至於你的第二點,確實不是所有可能的值都可以正確字符串化,但大多數值都可以。但是,memoization通過爲一組參數創建唯一標識符來工作。字符串化是一個常用的方法,但只要你可以創建一個唯一的標識符,你可以記住它。 –