# 柯里化与反柯里化

# 柯里化

# 定义

柯里化,可以理解为提前接收部分参数,延迟执行,不立即输出结果,而是返回一个接受剩余参数的函数。因为这样的特性,也被称为部分计算函数。柯里化,是一个逐步接收参数的过程。

通俗易懂的解释:用闭包把参数保存起来,当参数的数量足够执行函数了,就开始执行函数。

# 实现

  • 判断当前函数传入的参数是否大于或等于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

# 应用场景

参数复用

# 反柯里化

# 定义

反柯里化,是一个泛型化的过程。它使得被反柯里化的函数,可以接收更多参数。目的是创建一个更普适性的函数,可以被不同的对象使用。非我之物,为我所用

# 实现

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

# 总结

  • 函数柯里化就是对高阶函数的降阶处理,缩小适用范围,创建一个针对性更强的函数。
  • 反柯里化就是反过来,增加适用范围,让方法使用场景更大

参考 柯里化和反柯里化 函数柯里化

Last Updated: 10/29/2020, 1:21:25 AM