function sum(a, b, c, d) {
  console.log(a, b, c, d);
}

// 目标是将 newSum(a,b)(c)(d) 执行以上内容

const currying = function (fn, arr = []) {
  return (...args) => {
    let concatArr = [...arr, ...args]
    if (concatArr.length < fn.length) {
      return currying(fn, concatArr)
    } else {
      fn(...concatArr)
    }
  }
}

const newSum = currying(sum)

/* 
首先创建一个函数,把目标sum给传入进来,并且创建一个arr做为变量存储sum的参数
然后返回一个函数接收第一个sum函数里面的参数,并且用arr保存存储的参数
接下来判断存储下来的参数是不是小于传进来的sum的参数
如果小于,则递归currying并且传入同样是fn的函数,但是把剩余的参数给传进来
接着如果等于则把sum传出并且带上所有的参数
*/

newSum(1, 2)(3)(4)

柯里化的小应用

const currying = function (fn, arr = []) {
  let currentLength = fn.length
  return (...args) => {
    let newArr = [...arr, ...args]
    if (newArr.length < currentLength) {
      return currying(fn, newArr)
    } else {
      return fn(...newArr)
    }
  }
}

function isType(type, content) {
  return Object.prototype.toString.call(content) === `[object ${type}]`
}

let utils = [];

['String', 'Boolean', 'Number', 'Undefined', 'Null', 'Object', 'Array'].forEach(element => {
  utils[`is${element}`] = currying(isType)(element)
});

console.log(utils.isString(123));

Last modification:December 6, 2020
If you think my article is useful to you, please feel free to appreciate