javascript - 有没有办法可以在 JavaScript 中创建无限闭包
问题描述
有人向我提出了问题,但我不知道该怎么做
add() -> 返回 0
add(1)() -> 返回 1
add(1)(2)() -> 返回 3
加(1)(2)(3)(4)()-> 10
基本上可以继续
解决方案
如果您喜欢美学,这是我的一站式解决方案
const add = (val) => (val ? (arg) => (arg ? add(val + arg) : val) : 0);
console.log(add(1)(2)(3)())
为了可读性:
const add = (val) => {
if (val) {
return (arg) => {
if (arg) {
return add(val + arg);
} else {
return val;
}
};
}
return 0;
};
console.log(add(1)(2)(3)())
编辑:解释
我将尝试以简单的方式解释它
让我们用一个例子来分解它 add(1)(2)(3)()
所以它会像这样发生
add(1)
首先被评估add(1)
-> 返回一个函数(比如 _add())_add()
是一个闭包,因此它可以访问 val 变量(值为 1)并有自己的参数 args 值为 2_add(2)
add()
->使用加法结果再次调用(val + args)
add(1)(2)(3)()
变成->_add(2)(3)()
_add(2)
检查它是否有参数 args,如果有,则计算 val + args 并返回 add(val +args) else 0
_add(2)(3)()
变成->add(3)(3)()
- 添加(3)-> _add()
- _add(3) -> val + args -> add(val+args) -> add(6)
add(3)(3)()
变成->_add(6)()
add(6)()
-> 返回 _add()_add()
这次没有参数所以返回值
我希望我能够解释,如果您有任何疑问,请发表评论,我会尽力而为
推荐阅读
- reactjs - 如何只访问一次 React Redux 值?
- sql - 将 JSON 数组数据添加到临时表或真实表中
- javascript - 使用多个 CSS 网格 - 使用两个网格但希望它们都从页面顶部开始
- angular - Angular - http 拦截器 - http 速率限制器 - 滑动窗口
- sql - 使用 sequelize 处理竞争条件容易出错的代码
- flutter - PopupMenuButton 菜单总是与屏幕的一侧有间隙
- r - 在 R markdown 中调整绘图比例
- c# - 将 appsettings.json 映射到类
- c# - AJAX 方法未发布到 Web 方法
- javascript - 将多个参数传递给 Vuex 动作