柯里化(Currying)与反柯里化(unCurrying)
add(1)(2)(3)=6
经常会被问到类似这样的问题如何实现,这就是一个柯里化的问题。
柯里化(Currying),也称为局部调用,是把接受多参数函数变换为一系列单一参数的函数并进行调用的技术。
一个闭包的栗子
function sum(x) {
return (y) => {
return (z) => {
return x + y + z
}
}
}
console.log(sum(1)(2)(3)) // 6
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
以上的代码能跑起来,是因为 JavaScript 支持 闭包。
通用实现
在 JavaScript 语言精粹中,提到了一种柯里化的实现。
// Function.prototype.curry = function(){
// var slice = Array.prototype.slice,
// args = slice.apply(arguments),
// that = this;
// return function(){
// return that.apply(null,args.concat(slice.apply(arguments)));
// }
// }
function currying(fn) {
var slice = Array.prototype.slice,
__args = slice.call(arguments, 1);
return function () {
var __inargs = slice.call(arguments);
return fn.apply(null, __args.concat(__inargs));
};
}
function test(...T){
console.log(T.reduce((sum, single) => sum += single))
}
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
反柯里化
函数柯里化,是固定部分参数,返回一个接受剩余参数的函数,也称为部分计算函数,目的是为了缩小适用范围,创建一个针对性更强的函数。
那么反柯里化函数,从字面讲,意义和用法跟函数柯里化相比正好相反,扩大适用范围,创建一个应用范围更广的函数。使本来只有特定对象才适用的方法,扩展到更多的对象。