一文搞懂函数柯里化

啥子是柯里化

函数柯里化 是根据老外的名翻译而来,个人认为应该叫 参数颗粒化更合适一些。

举一个小栗子,写一个是否成年 的函数,如下

function exceedLevel(level, age) {
  return level < age;
}

console.log(exceedLevel(18, 20));
console.log(exceedLevel(18, 30));
console.log(exceedLevel(18, 12));

上边的代码每次都要传递参数 18,是不是有点烦?那接下来这样:

function exceedLevelOf(level) {
  return function (age) {
    return level < age;
  };
}

let exceedLevelOf18 = exceedLevelOf(18);
console.log(exceedLevelOf18(20));
console.log(exceedLevelOf18(30));
console.log(exceedLevelOf18(12));

同学们看到这里会说,这不就是闭包吗?是滴,这也叫 函数柯里化,可以这样认为,函数柯里化所依据的原理其实是闭包。

那么什么叫柯里化?
当一个函数有多个参数的时候,我们可以先传递一部分参数调用他,返回一个新的函数,接收其余的参数,返回函数结果。

lodash 中的 curry

上述代码只是表示什么叫柯里化,并没有通用性。在实际项目中,我们通常使用lodash 中的curry 函数来实现。 curry 函数的作用是:创建一个函数,该函数接受func的参数,并调用func返回其结果(若func参数都被提供);否则返回一个接受剩余func参数的函数,至到所有参数被提供,方可被调用。
如下:

import { curry } from "lodash-es";

function add(a, b, c) {
  return a + b + c;
}

let curriedAdd = curry(add);

console.log(curriedAdd(1, 2, 3));
console.log(curriedAdd(1, 2)(3));
console.log(curriedAdd(1)(2, 3));
// function 等待剩余参数
console.log(curriedAdd(1, 2));  

柯里化的实现原理

_curry函数接收一个函数,并且返回一个函数

function _curry(func) {
  return function curriedFunc(...args) {
    if (func.length > args.length) {
      return function () {
        return curriedFunc(...args.concat(Array.from(arguments)));
      };
    }
    return func(...args);
  };
}

版本说明

  • 2021.8.26 形成初版

参考资料

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值