JavaScript 实现add(1)(2)(3) 或 add(1,2,3)(4)(5)
通过以上的调用示例,有以下分析:
- 因为函数是在连续调用,所以函数的返回值应该也是一个同样功能的函数
- 因为函数可以连续调用不确定的次数,所以使用递归每次调用完都返回同样功能的函数
- 因为函数每次调用后的结果需要保存下来,供下次调用使用,所以在外部函数内使用闭包保存结果值
- 因为每次调用函数参数的个数不确定,所以可以使用函数的 arguments 接收参数
- 因为返回值是一个函数,但是我们需要获取到结果值,所以需要重写函数的toString方法传递结果值,这样在获取函数返回值时就会调用toString方法
函数实现示例代码:
function add() {let result = [...arguments].reduce((prev,curr) => prev + curr, 0)let loop = function() {let args = [...arguments]result = args.reduce((prev,curr) => prev + curr, result)return loop}loop.toString = function() {return result}return loop
}
console.log(add(1)(2)(3)) // 6
console.log(add(1,2,3)(4)(5)) // 15