定义
将一个接收多个参数的函数转换成多个接受一个参数的函数,并且返回结果
纯函数:
首先定义一个纯函数,这个纯函数是用来比较年龄大小的,函数接收两个参数,一个是最小值,一个是年龄,如果年龄大于最小值则返回true
, 否则返回false
,代码如下
function checkAge(min, age) {
return age > min
}
高阶函数
但是我们并不会一直以这个标准来判断是否符合要求,如果我们是要年龄小于某个标准的的呢?,这个时候我们可以把纯函数改编成高阶函数。此时这个方法有恶更容易服用了,只需要执行一次checkAge
,并且传入最小值min
,然后函数就会返回另外一个函数,我们只需要调用这个函数就可以判断大小了
function checkAge(min) {
return function(age) {
return age < min
}
}
const checkAge18 = checkAge(18)
checkAge18(12); // true
checkAge18(20); // false
lodash中的curry函数:
lodash中的curry函数的主要作用就是将同时接收多个参数的函数转变为接收不固定值的函数,每接受一个就返回另外一个函数,直到接受的参数总数量等于定义时接受的参数总数量,看下面代码
const lodash = requir('lodash');
function add(a, b, c) {
return a + b +c
}
const curried = lodash.curry(add);
curried(1,2,3);
curried(1)(2)(3);
curried(1,2)(3);
// 在参数没有接收完时返回的是方法,而不是结果,知道参数接收完为止
const curr = curried(1,2);
curr(3)
curry的作用就是上面代码中展示的,add方法在经过curry处理后,接收的参数变得更灵活,可以变成一元参数接收也可以用二元参数接收,但原则上只要总体的参数接收的数量等于原函数接收的参数总量即可。
自己实现一个curry函数
function curry(func) {
// args 首次调用返回值时的参数
return function curried(...args) {
// 如果func函数应接收的函数参数数量大于调用时接受的函数参数数量则代表参数接受不完全,需要继续返回
if(func.length > args.length) {
return function() {
// arguments时当前函数的参数
// 递归调用curried,并将参数组合传进去,直到参数完整
return curried(...[...args, ...arguments])
}
}
// 如果func接受的参数数量等于首次调用时参数的数量,代表参数完成了,可以直接调用函数
return func(...args)
}
}