实现add(1)(2)(3)

# 函数柯里化
函数式编程里面的概念。指传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。 简单来说:每次调用函数时,它只接受一部分参数,并返回一个函数,直到传递所有参数为止。 作用:参数复用、提前返回和延时执行
# 实现add(1)(2)(3)
const add = x => y => z => x + y + z
1
看起来并不难,但是实现一个add函数,同时支持下面这几种用法呢
add(1, 2, 3)
add(1, 2)(3)
add(1)(2, 3)
1
2
3
2
3
这里我们要自己实现一个工具函数专门生成柯里化函数。 主要思路:判断当前传入函数参数的个数是否大于等于原函数所需参数个数,如果是,则执行当前函数,若小于,则返回一个函数
const curry = (fn, ...args) =>
// 函数的参数个数可以直接通过函数数的.length属性来访问
args.length >= fn.length // 这个判断很关键!!!
// 传入的参数大于等于原始函数fn的参数个数,则直接执行该函数
? fn(...args)
/**
* 传入的参数小于原始函数fn的参数个数时
* 则继续对当前函数进行柯里化,返回一个接受所有参数(当前参数和剩余参数) 的函数
*/
: (..._args) => curry(fn, ..._args, ...args);
function add1(x, y, z) {
return x + y + z;
}
const add = curry(add1);
console.log(add(1, 2, 3));
console.log(add(1)(2)(3));
console.log(add(1, 2)(3));
console.log(add(1)(2, 3));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
那么,无限层级版呢?
add(1)(2)(3)...(n)
1
function argsSum(args) {
return args.reduce((pre, cur) => {
return pre + cur
})
}
function add(...args1) {
let sum1 = argsSum(args1)
let fn = function (...args2) {
let sum2 = argsSum(args2)
return add(sum1 + sum2)
}
fn.toString = function () {
return sum1
}
return fn
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
上次更新: 2022/09/02, 17:10:06