函数柯里化
2023年9月14日...大约 2 分钟
什么是柯里化
一句话概括:将传入多个参数的函数改造为传入单个函数,并返回可接受其他参数的函数的过程,就称为函数的柯里化。 一般常用于:JS脚本打包时用于降低代码量,减小打包后文件大小;以及面试题。
柯里化的示例——经典add
假设这里有一个函数:
function add(a, b) {
return a + b
}
需要对其进行函数的柯里化处理,则我们可以将其修改为以下构造:
function addCurry(a) {
return function(b) {
return a + b
}
}
这就是函数的柯里化。
柯里化的示例——多个给定数量数add
假设这里有一个函数:
function add(a, b, c) {
return a + b + c
}
需要对其进行函数的柯里化处理,则我们可以将其修改为以下构造:
function addCurry(a) {
return function(b) {
return function(c) {
return a + b + c
}
}
}
如果你认为这样太过于冗余,可以尝试以下方法进行改造:
let addArray = []
function addCurry(...args) {
addArray.push(...args)
if (addArray.length > 3) {
let result = addArray.splice(0, 3).reduce((a, b) => {
return a + b
})
addArray = []
return result
}
return addCurry
}
柯里化的示例——多个自定义数量数add
假设这里期望有一个函数可以对自定义数量的数进行相加操作,则我们可以将上题中所写代码修改为以下构造:
function addInNumberOf(length) {
let addArray = []
return function addCurry(...args) {
addArray.push(...args)
if (addArray.length > length) {
let result = addArray.splice(0, length).reduce((a, b) => {
return a + b
})
addArray = []
return result
}
return addCurry
}
}
这个函数的使用方法如下:
let addThreeTimes = addInNumberOf(3);
console.log(addThreeTimes(1)(2)(3)); // 输出 6
在这个例子中:
- 第一次调用addInNumberOf(3)返回一个新的函数,我们把它赋值给变量addThreeTimes。
- 通过连续调用addThreeTimes(1)(2)(3)得到结果6。
- 因为每次调用都会把新的参数添加到数组中,当数组的长度达到3时,就计算出1+2+3的结果并返回。