什么是函数柯里化?
curry 的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。你可以一次性地调用 curry 函数,也可以每次只传一个参数分多次调用。
实现原理:返回函数使其可持续执行,利用闭包将外层参数保存,可实现参数/变量的多层传递
1 | function add(a) { |
使用lodash的curry函数:1
2
3
4
5
6
7
8
9
10function add(a, b) {
return a + b
}
const curryAdd = _.curry(add)
curryAdd(1)(2) // 3
curryAdd(1, 2) //3
const increment = curryAdd(1)
increment(5) // 6
使用场景
常见的使用场景一般分三类,看下面的例子
- 参数复用
1 | function log(name, subject, score) { |
我们也可以把它传入map、filter等函数:…
- 延迟执行
- 提前确认
如何实现一个通用的柯里化函数
参照lodash的使用api,我大概实现了下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18/**
* 柯里化通用
* @param { function } fn 需要柯里化的函数
* @param { number } fn 指定需要累积的参数个数 (可选)
* @returns { function }
*/
function curry(fn, l) {
let argL = 0;
return function f(...args) {
argL = args.length;
if (argL === (l || fn.length)) {
return fn.apply(this. args);
}
return (..._args) => {
return f(...args, ..._args);
}
}
}