现给定一个函数 fn ,返回该函数的一个 记忆化 版本。 一个 记忆化 的函数是一个函数,它不会被相同的输入调用两次。而是会返回一个缓存的值。 函数 fn 可以是任何函数,对它所接受的值类型没有任何限制。如果两个输入值在 JavaScript 中使用 === 运算符比较时相等,则它们被视为相同。
时间: 2024-04-11 13:26:26 浏览: 157
一道优雅面试题分析js中fn 和return fn 的区别.docx
你可以使用闭包来实现一个记忆化函数。闭包是指一个函数可以访问并操作其外部函数作用域中的变量。下面是一个示例代码,展示了如何实现一个记忆化函数:
```javascript
function memoize(fn) {
const cache = {};
return function(...args) {
const key = JSON.stringify(args);
if (cache.hasOwnProperty(key)) {
return cache[key];
}
const result = fn.apply(this, args);
cache[key] = result;
return result;
};
}
```
在这个示例中,memoize 函数接受一个函数 fn 作为参数,并返回一个新的函数。这个新函数会检查是否已经计算过输入参数 args 的结果。如果已经计算过,则直接返回缓存的结果;否则,调用原始函数 fn,并将结果存储在缓存中。
你可以像下面这样使用 memoize 函数来创建记忆化版本的函数:
```javascript
const expensiveFunction = function(n) {
// 假设这是一个耗时的计算
console.log('Computing...');
return n * 2;
};
const memoizedFunction = memoize(expensiveFunction);
console.log(memoizedFunction(5)); // 第一次调用,会计算结果
console.log(memoizedFunction(5)); // 第二次调用,直接返回缓存的结果
console.log(memoizedFunction(10)); // 第一次调用,会计算结果
console.log(memoizedFunction(10)); // 第二次调用,直接返回缓存的结果
```
在上面的示例中,expensiveFunction 是一个耗时的函数。通过使用 memoize 函数,我们创建了一个记忆化版本的函数 memoizedFunction。第一次调用 memoizedFunction(5) 会计算结果并缓存起来,第二次调用 memoizedFunction(5) 则直接返回缓存的结果,避免了重复计算。
希望这个示例能帮助到你!如果你有任何疑问,请随时问我。
阅读全文