javascript - 在另一个函数中传递函数参数
问题描述
我在看一篇关于 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。但是我不明白的部分是...args
内部 memoize 函数如何成为传递函数的参数fn
?arguments
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
推荐阅读
- java - 根据其值删除 Firebase 子项
- cordova - 如何在 Capacitor 应用程序中设置 Cordova 插件变量?
- html - laravel 和 jquery 中的自动完成搜索框问题
- python - Python:蛮力数独递归
- flutter - Dart 扩展 - 出现“不是类型”错误
- java - 如何使用springboot将消息发布到rabbit MQ(运行时提供的队列详细信息)?
- twilio - Twilio:是否可以在不使用 SDK 的情况下生成访问令牌以连接到视频室?
- audio - 解析 ACID 循环和/或 REX 文件以提取瞬态数据
- c# - 带有 Windows 身份验证的 ASP.Net Core 3.1 中的空闲超时
- python - 如何在 python 中使用循环或其他方式将不同的 Defs 应用于不同的变量?