首页 > 解决方案 > 有没有办法可以在 JavaScript 中创建无限闭包

问题描述

有人向我提出了问题,但我不知道该怎么做

add() -> 返回 0

add(1)() -> 返回 1

add(1)(2)() -> 返回 3

加(1)(2)(3)(4)()-> 10

基本上可以继续

标签: javascriptclosures

解决方案


如果您喜欢美学,这是我的一站式解决方案

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()这次没有参数所以返回值

我希望我能够解释,如果您有任何疑问,请发表评论,我会尽力而为


推荐阅读