Nieyt's Blog

js函数柯里化的使用场景及实现

字数统计: 354阅读时长: 1 min
2021/05/12 Share

什么是函数柯里化?

curry 的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。你可以一次性地调用 curry 函数,也可以每次只传一个参数分多次调用。

实现原理:返回函数使其可持续执行,利用闭包将外层参数保存,可实现参数/变量的多层传递

1
2
3
4
5
6
function add(a) {
return function (b) {
return a + b
}
}
add(1)(2) // 3

使用lodash的curry函数:

1
2
3
4
5
6
7
8
9
10
function 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. 参数复用
1
2
3
4
5
6
7
8
function log(name, subject, score) {
console.log(`${name}: ${subject}${score}分`)
}

const logZhangSan = _.curry(log)('ZhangSan')

logZhangSan('English', 120)
logZhangSan('Math', 130)

我们也可以把它传入map、filter等函数:…

  1. 延迟执行
  2. 提前确认

如何实现一个通用的柯里化函数

参照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);
}
}
}

CATALOG
  1. 1. 什么是函数柯里化?
  2. 2. 使用场景
  3. 3. 如何实现一个通用的柯里化函数