手写柯里化函数
函数前置知识:
const curry = (args1) => {
console.log('args1:',args1)
return function (args2) {
console.log('args2:',args2)
return function (...args3) {
console.log('args3:',...args3)
}
}
}
curry(1)(2)(3,4)
// args1:1
// args2:2
// args3:3,4
原生方法
const curryingAdd = function(x) {
return function(y) {
return function(z) {
return x + y + z
}
}
}
// 调用
console.log(curryingAdd(1)(2)(3))
// 即
const fn = curryingAdd(1)
const fn1 = fn(2)
console.log(fn1(3))
柯里化函数
思路: 执行函数 fn + 递归合并参数函数 curry
执行函数 fn
- 声明执行函数,
- 返回参数计算
递归合并参数函数 curry :fn 函数 + arg 参数
- 首次声明出数组
- 返回函数
- 获取每个参数转为数组
restArg = Array.from(arguments)
- 记录全部参数个数
argLength = arg.length + restArg.length
- 参数合并到新数组
argArr = arg.concat(restArg)
- 参数数组 与 总参数 比较
- 大于:返回执行函数
- 小于:继续递归合并参数 curry(fn,argArr)
- 获取每个参数转为数组
const fn = (x,y,z) => {
return x+y+z
}
const curry = (fn,arg) => {
if(!Array.isArray(arg)){
var arg = []
}
return function () {
const restArg = Array.from(arguments)
const argLength = arg.length + restArg.length
const argArr = arg.concat(restArg)
return argLength < fn.length ? curry(fn,argArr) : fn.apply(null,argArr)
}
}