在实际业务中,我们经常定义这样的函数:
function isQualified(min, actual) {
return actual > min;
}
console.log(isQualified(60, 59));
console.log(isQualified(60, 90));
console.log(isQualified(60, 88));
在调用函数,上述代码中。我们如果我们知道最小值是60,没次都传递是不是有点重复,怎样办?是不是我们可以将 min先存起来,是不是大聪明有点想法了,对滴,闭包
function isQualified(min) {
return function(actual) {
return min < actual;
}
}
let fnOver60 = isQualified(60);
console.log(fnOver60(59));
console.log(fnOver60(88));
console.log(fnOver60(90));
对于上面的例子,其实用到一个专有名词就是函数柯里化。
当一个函数有多个参数时,我们可以先传递一部分(这部分参数后面不会变化),然后然后返回一个函数接受剩余参数,返回结果。
上述例子有很大的局限性,柯里化后的函数并不通用,在lodash库中提供了柯里化的函数。
loadsh_curry
var _ = require('lodash');
function sum(a, b, c) {
return a + b + c;
}
let fnCurry = _.curry(sum);
console.log(fnCurry(1, 2, 3));
console.log(fnCurry(1)(2, 3));
console.log(fnCurry(1, 2)(3));
是不是很强大
模拟实现函数柯里化
那么我们自己实现函数柯里化,方便探索其原理:
- 需要一个函数参数,返回一个函数参数
- 当返回函数的参数大于等于形参个数时,直接调用;若小于形参个数,返回一个函数,继续接受参数
function sum(a, b, c) {
return a + b + c;
}
function curry(fn){
return function curryFn(...args){
if(args.length < fn.length) {
return function() {
return curryFn(...args.concat(Array.from(arguments)));
}
}
return fn(...args);
}
}
let fnCurry = curry(sum);
console.log(fnCurry(1, 2, 3));
console.log(fnCurry(1)(2, 3));
console.log(fnCurry(1, 2)(3));
函数柯里化好处
- 柯里化可以让我们给一个函数传递较少的参数得到一个已经记住了某些固定参数的新函数这是一种对函数参数的’缓存’,让函数变的更灵活,让函数的粒度更小
- 可以把多元函数转换成一元函数,可以组合使用函数产生强大的功能