Lodash中的柯里化:Curry
- 功能:创建一个函数,该函数接收一个或多个 func 的参数,如果 func 所需要的参数都被提供则执行 func 并返回执行的结果。否则继续返回该函数并等待接收剩余的参数。
- 参数:需要柯里化的函数
- 返回值:柯里化后的函数
// lodash中的curry
const _ = require("lodash");
// 这里定义一个三个数字相加的纯函数
function sum(a, b, c) {
return a + b + c;
}
const curried = _.curry(sum);
// 可以直接传入三个参数
console.log(curried(1, 2, 3));
// 可以传入一个参数,返回等待两个参数的function
console.log(curried(1)(2, 3));
// 可以传入一个参数,返回等待一个参数的function
console.log(curried(1, 2)(3));
总结
lodash的curry函数可以把任何多元参数的函数,转换为一元函数
柯里化案例
// 柯里化案例
const _ = require("lodash");
// 使用curry传入一个匿名函数,并且包含两个参数
const match = _.curry(function (reg, str) {
return str.match(reg);
});
// 传入其中一个参数,返回一个等待参数str的一元函数,用于判断是否有空格
const haveSpace = match(/\s+/g);
// 传入其中一个参数,返回一个等待参数str的一元函数,用于判断是否有数字
const haveNumber = match(/\d+/g);
// console.log(haveSpace("hello world"));
// console.log(haveNumber("hello world 911"));
const filter = _.curry(function (func, array) {
return array.filter(func);
});
console.log(filter(haveSpace, ["1", "2 ", "3", "4 "]));
// 只传入一个参数,返回一个需要一个参数的函数
const findSpace = filter(haveSpace);
console.log(findSpace(["1", "2 ", "3", "4 "]));
柯里化原理
模拟实现Lodash中的curry方法
function curry(func) {
return function curriedFn(...args) {
if (args.length < func.length) {
return curriedFn(...args.concat(Array.from(arguments)));
}
return func(...args);
};
}
这段代码实现了一个函数柯里化(currying)的功能。
函数柯里化是一种将接受多个参数的函数转换为接受单个参数的函数序列的技术。柯里化可以让一个函数变得更加通用和灵活,并且可以使函数的复用性更强。
该函数curry()
接受一个函数作为参数,返回一个新的函数curriedFn()
。这个新函数接受任意数量的参数,并在必要时将它们保存在闭包中,直到所有的参数都被收集完毕后,再调用原始函数func()
。
具体来说,如果新函数curriedFn()
接收到的参数数量小于原始函数func()
的参数数量,则将这些参数与剩余的参数组合成一个新数组,并继续等待更多的参数。否则,当参数数量足够时,就调用原始函数func()
,并将参数传递给它。
这样做的好处是,调用curry()
函数后,我们可以使用生成的新函数curriedFn()
来多次调用原始函数func()
,并在每次调用时只提供部分参数
柯里化总结
- 柯里化可以让我们给一个函数传递较少的参数得到一个已经记住了某些固定参数的新函数
- 这是一种对函数参数的'缓存'
- 让函数变的更灵活,让函数的粒度更小
- 可以把多元函数转换成一元函数,可以组合使用函数产生强大的功能
1 条评论
真棒!