JS实现curry(柯里化)的四种简单方式

// 方法1
function curry (fn, args) {
  const length = fn.length
  const args = args || []
  return function () {
    const _args = Array.prototype.slice.call(arguments)
    Array.prototype.push.apply(args, _args);
    if (args.length >= length) {
      return fn.apply(null, args)
    } else {
      return curry.call(null, fn, args)
    }
  }
}

// 方法2
function curry2 (fn) {
  const length = fn.length
  return function inner (...args) {
    if (args.length >= length) {
      return fn.apply(null, args)
    } else {
      return function (...args2) {
        return inner.apply(null, args.concat(args2))
      }
    }
  }
}

// 方法3
function curry3 (fn) {
  const length = fn.length
  return function inner (...args) {
    if (args.length >= length) {
      return fn.apply(null, args)
    } else {
      return inner.bind(null, ...args)
    }
  }
}

// 方法4
function curry4 (fn) {
  const length = fn.length
  if (arguments.length - 1 >= length) {
    return fn.apply(null, Array.prototype.slice.call(arguments, 1))
  } else {
    return curry4.bind(null, ...arguments)
  }
}

你可能感兴趣的:(前端开发)