JS中的函数柯里化

在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。 – 维基百科

函数柯里化的好处在于:

  • 函数复用,提高适用性
  • 延迟执行

1.函数复用:

const match = (reg, str) => {
  console.log(str.match(reg));
};

const reg = /\s+/g;
// 重复调用reg变量
match(reg, 'hello world'); // [" "]
match(reg, 'spaceless'); // null

函数柯里化实现:

const curry = fn => {
  return (...args) => {
    return (...cb) => {
	  // 合并参数,立即执行
      return fn.apply(null, [...args, ...cb]);
    };
  };
};

const match = curry((reg, str) => {
  console.log(str.match(reg));
});
const hasSpace = match(/\s+/g);

hasSpace('hello world'); // [" "]
hasSpace('spaceless'); // null

缩小函数的适用范围,但同时提高函数的适用性

2.延迟执行

const curry = (fn) => {
  return (...args) => {
    return function _f() {
      if (arguments.length) {
        // 参数不为空,合并参数
        args.push(...arguments);
        // 返回自身,链式调用
        return _f;
      }
      // 参数为空,立即执行
      return fn.apply(null, args);
    };
  };
};

// 累加方法
const add = curry((...arr) => {
  return arr.reduce((next, p) => {
    return next + p;
  }, 0);
});

console.log(add(1, 2, 3, 4)(5)()); // 15
console.log(add(1)(2)(3)(4)(5)()); // 15

累积传入参数,当不传参数的时候,最后执行。

参考地址:

Comments