手写 curry 函数,实现函数柯里化
手写 curry 函数,实现函数柯里化
function curry(fn: Function) {
const fnArgsLength = fn.length // 传入函数的参数长度
let args: any[] = [];
function calc(this: any, ...newArgs: any[]) {
// 积累参数
args = [
...args,
...newArgs
]
if (args.length < fnArgsLength) {
// 参数不够,返回函数
return calc
} else {
// 参数够了,返回执行结果
return fn.apply(this, args.slice(0,fnArgsLength))
}
}
return calc
}
function add(a: number, b: number, c: number) {
return a + b + c
}
add(10, 20, 30) // 60
const curryAdd = curry(add)
curryAdd(10)(20)(30)
- curry 返回的是一个函数 fn
- 执行 fn ,中间状态返回函数,如 add(1) 或者 add(1)(2)
-
最后返回执行结果,如add(1)(2)(3)
- 工作不常用,面试很爱考
- 如果有 this,慎用箭头函数