# 柯里化与反柯里化
# 柯里化
# 定义
柯里化,可以理解为提前接收部分参数,延迟执行,不立即输出结果,而是返回一个接受剩余参数的函数。因为这样的特性,也被称为部分计算函数。柯里化,是一个逐步接收参数的过程。
通俗易懂的解释:用闭包把参数保存起来,当参数的数量足够执行函数了,就开始执行函数。
# 实现
- 判断当前函数传入的参数是否大于或等于
fn
需要参数的数量,如果是,直接执行fn
- 如果传入参数数量不够,返回一个闭包,暂存传入的参数,并重新返回
currying
函数
function currying(fn, ...args) {
if (args.length >= fn.length) {
return fn(...args);
} else {
return (...args2) => currying(fn, ...args, ...args2);
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 应用场景
参数复用
# 反柯里化
# 定义
反柯里化,是一个泛型化的过程。它使得被反柯里化的函数,可以接收更多参数。目的是创建一个更普适性的函数,可以被不同的对象使用。非我之物,为我所用
# 实现
Function.prototype.uncurring = function () {
var self = this;
return function (obj, ...args) {
return self.apply(obj, args)
}
}
var push = Array.prototype.push.uncurring();
//测试一下
(function () {
push(arguments, 4);
console.log(arguments); //[1, 2, 3, 4]
})(1, 2, 3)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 总结
- 函数柯里化就是对高阶函数的降阶处理,缩小适用范围,创建一个针对性更强的函数。
- 反柯里化就是反过来,增加适用范围,让方法使用场景更大