定時記憶
某些操作在計算上是昂貴的,但由於它們的結果可能會隨著時間或外部影響而改變,它們不適合典型的記憶——例如 getElementsByClassName
.這是我為幫助解決這些情況而製作的一個 JavaScript 定時記憶裝飾器/高階函數,它接受一個以毫秒為單位的可選過期參數。
function memoize (functor, expiration) { var memo = {}; return function () { var key = Array.prototype.join.call(arguments, "§"); if (key in memo) return memo[key]; if (expiration) setTimeout(function () {delete memo[key];}, expiration); return memo[key] = functor.apply(this, arguments); }; }
這種方法允許您將任何函數轉換為記憶函數。請注意,為每組參數記住返回值。但是,由於技術限制,它僅在參數是數組或標量值時才可靠,但您可以輕鬆使用例如一個 toJSON
方法而不是 join
將對象序列化為緩存鍵的一部分(需要額外的開銷)。
你可以像這樣使用上面的代碼:
// Make a function which memoizes for 1000 milliseconds at a time var fn = memoize(function () { Array(500000).join("."); // slow return true; }, 1000);
…或者省略過期參數以永久記憶。
這裡還有幾篇關於 JavaScript 記憶的文章:
- Oliver Steele 的單行 JavaScript 記憶
- Keith Gaughan 在 JavaScript 中的記憶