Js 实现柯里化(ES5,ES6)

柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。

基础的柯里化

  • 演示
function add(a, b) {
  return a + b;
}
function curring(fn) {
  return function (arg1) {
    return function (arg2) {
      return fn(arg1, arg2);
    };
  };
}
curring(add)(1)(2); // 返回值为 3

 

这样就可以对一个函数实现实现柯里化,但这样的方式并不通用,实际的开发过程中由于参数数量的不确定性,不会对每一个需要柯里化的函数单独的进行封装,这时候需要基于柯里化的思想封装一个通用的柯里化函数。

 

通用的柯里化实现

在实现柯里化的过程中主要需要注意以下几点:
  • arguments 是一个伪数组
  • 使用递归的思想来实现参数不确定的情况

ES5 实现

function curry(fn) {
  return function curriedFn() {
    var _args = Array.prototype.slice.call(arguments);
    if (_args.length < fn.length) {
      return function () {
        var _args2 = Array.prototype.slice.call(arguments);
        return curriedFn.apply(null, _args.concat(_args2));
      };
    }

    return fn.apply(null, _args);
  };
}
 

ES6 实现

在 ES6 环境中可以使用 ES6 语法糖对上面的代码进行简化。
function curry(fn) {
  return function curriedFn() {
    var _args = Array.prototype.slice.call(arguments);
    if (_args.length < fn.length) {
      return function () {
        var _args2 = Array.prototype.slice.call(arguments);
        return curriedFn.apply(null, _args.concat(_args2));
      };
    }

    return fn.apply(null, _args);
  };
}

 

posted @ 2020-10-30 11:46  siegaii  阅读(621)  评论(0)    收藏  举报