Skip to main content

手写柯里化函数

函数前置知识:

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

  1. 声明执行函数,
  2. 返回参数计算

递归合并参数函数 curry :fn 函数 + arg 参数

  1. 首次声明出数组
  2. 返回函数
    • 获取每个参数转为数组 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)
}
}

参考文章