我正在查看一篇关于
JavaScript中的memoize函数的文章,并偶然发现了下面的示例
// same memoize function from before
const memoize = (fn) => {
let cache = {};
return (...args) => {
let n = args[0];
if (n in cache) {
console.log('Fetching from cache', n);
return cache[n];
}
else {
console.log('Calculating result', n);
let result = fn(n);
cache[n] = result;
return result;
}
}
}
const factorial = memoize(
(x) => {
if (x === 0) {
return 1;
}
else {
return x * factorial(x - 1);
}
}
);
console.log(factorial(5)); // calculated
console.log(factorial(6)); // calculated for 6 and cached for 5
在上面的memoize函数中,args变量是如何定义的?谁能帮助我理解它?
const memoize = (fn) => {
let cache = {};
return (...args) => {
...
从调用开始,args似乎只是来自传递函数fn的参数/参数的变量,但是我无法理解为什么以及上面的代码块是如何工作的.
此外,这个代码/设计模式是否有名称?
编辑我已经读过关于arguments和rest parameters.但是我不明白的部分是如何…来自memoize函数的args成为传递函数fn的参数?
参数object或rest参数不应该… args只表示当前函数memoize的参数/参数,即fn参数?在那种情况下,args [0]是函数fn?
最佳答案 不要将它混淆为fn在返回函数中神奇地传递的参数.
您对功能和范围的理解是正确的.
如果我重构代码,这就是它的样子.
const memoize = () => {
//just renamed the returned function to somefn
return somefn();
}
const somefn = (...args) => {
// somefn takes x as argument when we called factorial(x)
let cache = {};
let n = args[0];
if (n in cache) {
console.log('Fetching from cache', n);
return cache[n];
}
else {
console.log('Calculating result', n);
let result = foo(n);
cache[n] = result;
return result;
}
}
//your business logic is in foo now
const foo = (x) => {
if (x === 0) {
return 1;
}
else {
return x * factorial(x - 1);
}
}
const factorial = memoize(foo);
console.log(factorial(5)); // calculated