函数柯里化(Currying)就是将函数多个参数转换成一列单个参数的函数。

例如:

x = f(a, b, c) 变成
    h = g(a)
    i = h(b)
    x = i(c)
或者序列调用
x = f(a)(b)(c)

在 JS 简单使用

使用函数声明式

function currying(a) {
  return function(b) {
    console.log(a, b);
  }
}

currying('a')('b');

使用函数表达式

const currying = function(a) {
  return function(b) {
    console.log(a, b);
  }
}

currying('c')('d');

使用箭头函数

const currying = (a) => (b) => {
  console.log(a, b);
}

currying('e')('f')

JS 函数柯里化

柯里化函数通常由以下步骤动态创建:调用另一个函数并为它传入要柯里化的函数和必要的参数。

function add() {
  const args = Array.prototype.slice.call(arguments);
  return args.reduce(function(a, b) {
    return a + b;
  });
}

function currying(fn) {
  var args = Array.prototype.slice.call(arguments, 1);
  return function() {
    var innerArgs = Array.prototype.slice.call(arguments);
    var finalArgs = args.concat(innerArgs);
    return fn.apply(null, finalArgs);
  };
}

const curryAdd = currying(add, 10);
curryAdd(1); // 11
curryAdd(2, 3); // 15
curryAdd(3); // 13

通过闭包将初步参数保存下来,然后获取剩下的参数进行拼接,最后执行需要 currying 的函数。这样在返回只扩展一个参数,不支持多参数调用,像 curryAdd(1)(2)(3) 这样的函数是无法执行的。

TODO

  • 实现不定参数 curry(1)(2)(3)

参考链接