1. 实现 sum 函数使得以下表达式的值正确
sum(1,2,3).sumOf(); // 6
sum(2,3)(2).sumOf(); // 7
sum(1)(2)(3)(4).sumOf(); // 10
sum(2)(4,1)(2).sumOf(); // 9
首先我们不难发现这个sum函数的作用是返回所有参数相加的和,难点在于传参个数不限,并且可以无限循环调用。
先从最简单的 sum(1, 2, 3, 4)
开始,这个我们可以很简单的实现:
function sum() {
let args = [].slice.call(arguments)
return args.reduce((a, b) => a + b)
}
再看 sum(1)(2)(3)(4)
其实就是函数柯里化:
function sum(a) {
return function(b) {
return function(c) {
return function(d) {
return a + b + c + d
}
}
}
}
但是这里的参数个数是固定的。
我们再看回原题,我们可以把sum
的作用看做是收集所有传入的参数,并返回了一个函数,这个函数有一个sumO