es6之前的写法

function curry(func){
    var args = Array.prototype.slice.call(arguments, 1);
    var that = this;
    return function() {
        var curryArgs = Array.from(arguments);
        var totalArgs = args.concat(curryArgs);
        if(totalArgs.length >= func.length){
            return func.apply(null, totalArgs);
        } else {
            totalArgs.unshift(func);
            return that.curryFn.apply(that, totalArgs);
        }
    }
}

es6之后的写法

function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn.apply(this, args);
    } else {
      return function(...moreArgs) {
        return curried.apply(this, args.concat(moreArgs));
      };
    }
  };
}

简写

const curry = (fn,...args) => 
    args.length >= fn.length
        ? fn(...args)
        : (...moreArgs) => curry(fn, ...args, ...moreArgs);