有没有办法在 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 相同的函数。您可以无限地执行此操作并将结果访问为返回函数的 属性。