【问题标题】:JavaScript Closures calculate sum [duplicate]JavaScript闭包计算总和[重复]
【发布时间】:2021-10-22 09:14:19
【问题描述】:

我刚开始学习 JavaScript 中的闭包,我正在尝试理解一个基本问题。

例如,我正在尝试实现 sum 方法:sum(1)(4)(5)

const sum = (a) => {
    return (b) => {
        if(typeof b === 'number')
            return sum(a+b)
        return a;
    }
}

当我调用:console.log(sum(1)(4)(5)()) 时,它运行良好并返回 10。但是,如果我调用 console.log(sum(1)(4)(5)),它会返回 [Function (anonymous)]。为什么?

谢谢

【问题讨论】:

  • in sum(1)(4)(5)() 最后一次调用会导致 if 语句被跳过,return a 被执行。但是,当您继续将数字传递给函数时,它会进入return sum(a+b),然后返回一个新的clojure
  • 因为函数在不同调用时返回不同的东西
  • 顺便说一句,当意图实现一个可以接受任意数量参数的函数时,有必要标记参数的结尾。您通过最后一个空呼叫来执行此操作。所以我认为你不能摆脱最后一个电话。
  • @AliBaykal 你是说如果不插入最后一个括号就没有什么可以让它工作
  • @user2792523,是的

标签: javascript closures


【解决方案1】:

每次你调用你的函数时:

sum(1)(10)

你正在返回内部函数:

(b) => {
        if(typeof b === 'number')
            return sum(a+b)
        return a;
    }

因为 b === 'number' 的类型并且您返回调用的 sum(a+b) 再次函数 sum 并再次返回内部函数。这就是为什么当你最后加上最后一个括号时:

sum(1)(10)()

内部函数将执行,在这种情况下,b 的类型与数字不同,并将返回已经包含值总和的 'a'。

【讨论】:

  • 我知道。我的问题是,如何在不插入最后一个括号的情况下使其工作
  • @user2792523 你不能,真的。您必须返回另一个函数,才能使用数字进行另一个调用。
猜你喜欢
  • 2014-08-28
  • 2016-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
相关资源
最近更新 更多