考点: 函数柯里化
一、什么是函数柯里化(curry)
函数柯里化(curry
)是函数式编程里面的概念。curry
的概念很简单:柯里化是把接受多个参数的函数转变为接受一个单一参数的函数,并且返回接受余下的参数且返回结果的新函数。
简单说就是:每次调用函数时,它只接收一部分参数,并返回一个函数,直到传递完所有的参数为止。
二、例子
1.接收两个参数
const add =(x,y) => x+y;
// add(1,2);
// 调整为每次只接收一个参数
const add = x => y => x+y;
// add(1)(2);
2.接收三个参数
尝试实现add(1)(2)(3)
仿照上面
const add = x => y => z => x+y+z;
看起来并不是那么难,但是如果面试官的要求是实现一个add
函数,同时支持下面这几种的用法呢:
add(1, 2, 3);
add(1, 2)(3);
add(1)(2, 3);
主要思路:判断当前传入函数的参数个数 (args.length
) 是否大于等于原函数所需参数个数 (fn.length
) ,如果是,则执行当前函数;如果是小于,则返回一个函数。
- fn.length: 表示的是这个函数中参数的个数.
const curry = (fn, ...args) =>
// 函数的参数个数可以直接通过函数的.length属性来访问
args.length >= fn.length
// 传入的参数大于等于原始函数fn的参数个数,则直接执行该函数
? fn(...args)
/**
* 传入的参数小于原始函数fn的参数个数时
* 则继续对当前函数进行柯里化,返回一个接受所有参数(当前参数和剩余参数) 的函数
*/
: (..._args) => curry(fn, ...args, ..._args);
function add1(x, y, z) {
return x + y + z;
}
const add2 = curry(add1);
console.log(add2(1, 2, 3));// 6
console.log(add2(1)(2)(3));// 6
console.log(add2(1, 2)(3));// 6
console.log(add2(1)(2, 3));// 6
3.参数长度不固定
function add(..args){return args.reduce((a,b)=> a+b}
function currying(fn){
let args=[]
return function temp(...newArgs){
if(newArgs.length){
args = [...args, newArgs]
return temp
} else {
let val = fn.apply(this, args)
args = []
return val
}
}
}
let addCurry = currying(add)
console.log(addCurry(1)(2)(3)(4, 5)())
console.log(addCurry(1)(2)(3, 4, 5)())
console.log(addCurry(1)(2, 3, 4, 5)())
三、柯里化有什么作用
- 参数复用
- 提前返回
- 延迟执行