fn(1, 2, 3)(4, 5, 6)(7)(8)()拿到总和的几种方法
时间: 2023-10-10 17:09:42 浏览: 29
这个问题可以通过函数柯里化(Currying)的方式来实现。具体来说,可以先定义一个函数 `fn`,然后让它返回一个闭包,这个闭包接收参数并返回一个新的闭包,直到所有参数都收集完毕后返回最终结果。
以下是几种实现方法:
方法一:使用递归和闭包
```javascript
function fn(...args) {
return function sum(...rest) {
if (rest.length === 0) {
return args.reduce((acc, cur) => acc + cur, 0);
} else {
return fn(...args, ...rest);
}
}
}
console.log(fn(1, 2, 3)(4, 5, 6)(7)(8)()); // 36
```
方法二:使用 ES6 的箭头函数和展开运算符
```javascript
const fn = (...args) => (...rest) =>
rest.length === 0 ? args.reduce((acc, cur) => acc + cur, 0) : fn(...args, ...rest);
console.log(fn(1, 2, 3)(4, 5, 6)(7)(8)()); // 36
```
方法三:使用 ES6 的可选链运算符和空合并运算符
```javascript
const fn = (...args) => {
const sum = args.reduce((acc, cur) => acc + cur, 0);
return rest => rest?.length ? fn(...args, ...rest) : sum;
};
console.log(fn(1, 2, 3)?.(4, 5, 6)?.(7)?.(8)?.()); // 36
```
无论使用哪种方法,最终都可以得到结果 36。