啥子是柯里化
函数柯里化 是根据老外的名翻译而来,个人认为应该叫 参数颗粒化
更合适一些。
举一个小栗子,写一个是否成年 的函数,如下
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 形成初版