函数柯里化

在实际业务中,我们经常定义这样的函数:

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));

是不是很强大

模拟实现函数柯里化

那么我们自己实现函数柯里化,方便探索其原理:

  1. 需要一个函数参数,返回一个函数参数
  2. 当返回函数的参数大于等于形参个数时,直接调用;若小于形参个数,返回一个函数,继续接受参数
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));

函数柯里化好处

  • 柯里化可以让我们给一个函数传递较少的参数得到一个已经记住了某些固定参数的新函数这是一种对函数参数的’缓存’,让函数变的更灵活,让函数的粒度更小
  • 可以把多元函数转换成一元函数,可以组合使用函数产生强大的功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值