文章中英模式
布鲁斯前端JS面试题目 - 实现 Memoize 记忆化函数
学习如何实现 JavaScript 的记忆化(memoization)函数,提升函数执行效率,避免重复计算,掌握缓存策略及其在前端开发中的应用。
文章中英模式
懒得看文章?那就来看视频吧
什么是 Memoize 记忆化
记忆化(Memoization)是一种优化技术,通过存储昂贵的函数调用结果,并在相同输入再次发生时返回缓存结果,来加速程序执行效率。它主要适用于函数式程序设计中的纯函数(相同输入总是产生相同输出)。
记忆化的核心概念
- 1.
缓存结果
:存储函数调用的结果 - 2.
缓存命中
:当相同参数再次调用时直接返回先前计算的结果 - 3.
纯函数
:没有副作用且输出仅由输入决定的函数,适合记忆化 - 4.
性能优化
:显著减少重复计算的时间成本
实现基本的 Memoize 函数
下面是一个基本的 memoize 函数实现,能够记忆任何纯函数的结果:
function memoize(fn) {
// 创建缓存对象
const cache = {};
// 返回一个新函数
return function(...args) {
// 将参数转换为字符串作为键值
const key = JSON.stringify(args);
// 检查缓存中是否有相应结果
if (key in cache) {
console.log('从缓存返回结果');
return cache[key];
}
// 如果没有缓存,则调用原函数计算结果
const result = fn.apply(this, args);
// 将结果存储到缓存中
cache[key] = result;
return result;
};
}
使用范例
// 计算斐波那契数列
function fibonacci(n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
// 未记忆化的函数调用 (效能差)
console.time('未记忆化');
console.log(fibonacci(35)); // 这将花费较长时间
console.timeEnd('未记忆化');
// 记忆化版本
const memoizedFibonacci = memoize(function(n) {
if (n <= 1) return n;
return memoizedFibonacci(n - 1) + memoizedFibonacci(n - 2);
});
// 记忆化后的函数调用 (效能大幅提升)
console.time('记忆化');
console.log(memoizedFibonacci(35)); // 快速返回结果
console.timeEnd('记忆化');