函数记忆化(memoization)是指缓存函数的计算结果,以便在相同的输入参数调用时,可以直接返回缓存的结果,从而提高函数的执行效率。
在JavaScript中,可以使用闭包和对象来实现函数记忆化。具体实现方法如下:
function memoize(func) {
var cache = {}; // 缓存计算结果的对象
return function() {
var args = JSON.stringify(arguments); // 将输入参数转换为字符串作为缓存的key
if (cache[args]) {
return cache[args]; // 如果缓存中已经有该结果,则直接返回缓存的结果
} else {
var result = func.apply(this, arguments); // 否则调用函数计算结果
cache[args] = result; // 将结果缓存起来
return result;
}
};
}
上述代码中,memoize
函数接收一个函数作为参数,并返回一个新的函数。新函数内部定义了一个cache
对象,用于缓存函数的计算结果。每次调用新函数时,将输入参数转换为字符串作为cache
对象的key,如果缓存中已经有该结果,则直接返回缓存的结果;否则调用原函数计算结果,并将结果缓存起来。
使用例子:
function add(x, y) {
console.log('calculating...');
return x + y;
}
var memoizedAdd = memoize(add);
console.log(memoizedAdd(1, 2)); // 第一次计算
console.log(memoizedAdd(1, 2)); // 直接返回缓存的结果
console.log(memoizedAdd(2, 3)); // 第一次计算
console.log(memoizedAdd(2, 3)); // 直接返回缓存的结果
运行结果:
calculating...
3
3
calculating...
5
5
在第一次调用memoizedAdd(1, 2)
时,add
函数被调用并计算结果,结果被缓存起来并返回。在第二次调用memoizedAdd(1, 2)
时,直接从缓存中返回结果,不再计算。同理,memoizedAdd(2, 3)
也只计算了一次。