# curry
柯里化(英语:Currying),又称为部分求值,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回一个新的函数的技术,新函数接受余下参数并返回运算结果。
实现一个add方法,使计算结果能够满足如下预期:
add(1)(2)(3) = 6
add(1, 2)(3) = 10
1
2
2
实现方法: 做一个闭包,返回一个函数,这个函数每次执行会改写闭包里面记录参数的数组。当这个函数判断参数个数够了,就去执行它。
function curry(func) {
// 存储已传入参数
let _args = []
// 做一个闭包
function _curry(...args) {
// 把参数合并
_args = _args.concat(args)
// 如果参数够了就执行
if (_args.length >= func.length) {
const result = func(..._args)
_args = []
return result;
}
// 继续返回此函数
else {
return _curry
}
}
return _curry
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 测试代码
function add1(a, b, c) {
return a + b + c
}
let testAdd = curry(add1)
console.log(testAdd(1)(2)(3))
console.log(testAdd(1, 2)(3))
console.log(testAdd(1)(2, 3))
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8