什么是函数curry化
在计算机科学中,柯里化(Currying)是把接收多个参数的函数变成接收单一参数的函数,并且返回
接受余下的参数且返回结果的新函数的技术。
- 通过
fn.length可以获取形参个数 - 闭包存储单个参数
- 存储的参数达到
fn.length,则认为参数传递完毕,直接执行fn
type Curry = {
(fn: (...args: any[]) => any): any
}
const curry: Curry = function (fn) {
// 收集fn的形参个数,作为判断依据
const presetLength = fn.length
const argsArr: any[] = []
return function handle(): any {
const args = Array.prototype.slice.call(arguments)
args.length && argsArr.push(...args)
// 判断收集的参数是否达到限值:没达到则继续返回收集函数;达到则直接执行;
if (argsArr.length < presetLength) {
// @ts-ignore
return handle.bind(this)
} else {
// @ts-ignore
return fn.apply(this, argsArr)
}
}
}
const testCurry = (a: number, b: number, c: any) => a + b + c
const curryDemo = curry(testCurry)
console.log(curryDemo(1)(2)(3, 4));