有没有办法在 JavaScript 中创建无限闭包
Is there a way I can create infinite closures in JavaScript
有人向我提出问题,但我不知道该怎么做
添加() -> returns 0
添加(1)() -> returns 1
添加(1)(2)() -> returns 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)
-> return 是一个函数(比如 _add())
_add()
是一个闭包,因此它可以访问 val 变量(值为 1)并有自己的参数 args,值为 2
_add(2)
-> 使用加法 (val + args)
的结果再次调用 add()
add(1)(2)(3)()
变为 -> _add(2)(3)()
_add(2)
检查它是否有参数 args,如果有则计算 val + args 和 returns add(val +args) else 0
_add(2)(3)()
变为 -> add(3)(3)()
- 添加(3) -> _添加()
- _add(3) -> val + args -> add(val+args) -> add(6)
add(3)(3)()
变为 -> _add(6)()
add(6)()
-> returns _add()
_add()
这次没有参数所以return值
我希望我能解释清楚,如果你有任何疑问,请评论,我会尽力
您可以通过变量arguments
访问参数。在这里阅读更多相关信息:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments
我使用了一个基本的 for 循环,主要是为了清楚起见,在下面展示它。
function add() {
var sum = 0;
for (let i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
/* Alternative loop
for (let number of arguments) {
sum += number;
} */
return sum;
}
console.log( add(1) );
console.log( add(1, 2) ); // returns 3
console.log( add(1, 2, 3, 4) ); // returns 10
我想你正在找这个。
function add(a){
func = function(b){
func.result+=b;
return func;
}
func.result = a;
return func;
}
console.log(add(2)(2).result);
每个顺序调用 returns 相同的函数。您可以无限地执行此操作并将结果访问为返回函数的 属性。
有人向我提出问题,但我不知道该怎么做
添加() -> returns 0
添加(1)() -> returns 1
添加(1)(2)() -> returns 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)
-> return 是一个函数(比如 _add())_add()
是一个闭包,因此它可以访问 val 变量(值为 1)并有自己的参数 args,值为 2
的结果再次调用_add(2)
-> 使用加法 (val + args)add()
add(1)(2)(3)()
变为 -> _add(2)(3)()
_add(2)
检查它是否有参数 args,如果有则计算 val + args 和 returns add(val +args) else 0
_add(2)(3)()
变为 -> add(3)(3)()
- 添加(3) -> _添加()
- _add(3) -> val + args -> add(val+args) -> add(6)
add(3)(3)()
变为 -> _add(6)()
add(6)()
-> returns _add()_add()
这次没有参数所以return值
我希望我能解释清楚,如果你有任何疑问,请评论,我会尽力
您可以通过变量arguments
访问参数。在这里阅读更多相关信息:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments
我使用了一个基本的 for 循环,主要是为了清楚起见,在下面展示它。
function add() {
var sum = 0;
for (let i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
/* Alternative loop
for (let number of arguments) {
sum += number;
} */
return sum;
}
console.log( add(1) );
console.log( add(1, 2) ); // returns 3
console.log( add(1, 2, 3, 4) ); // returns 10
我想你正在找这个。
function add(a){
func = function(b){
func.result+=b;
return func;
}
func.result = a;
return func;
}
console.log(add(2)(2).result);
每个顺序调用 returns 相同的函数。您可以无限地执行此操作并将结果访问为返回函数的 属性。