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));