我在看有关JavaScript中的记忆功能的文章,偶然发现了以下示例
// 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
在上面的备忘录功能中,{/ {1}}变量的定义/未来如何?有人可以帮我理解吗?
args
在调用中,看来const memoize = (fn) => {
let cache = {};
return (...args) => {
...
只是传递的函数args
中参数/参数的变量,但我无法确定上面代码块的原因和方式正在工作。
此外,此代码/设计模式是否有名称?
编辑,我已阅读有关lazy evaluation和arguments的内容。但是,我不了解的部分是,memoize函数中的fn
如何成为传递的函数...args
的参数?
fn
对象或其余参数arguments
是否仅代表当前函数...args
的参数/自变量,即memoize
参数?在这种情况下,fn
是函数args[0]
吗?
答案 0 :(得分:1)
不要把它当作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