函数柯里化

最近面试的时候,正好遇到了面试官问了一下函数柯里化,只记得是可以接收多个参数然后实现对参数的一个处理,但是具体怎么实现,以及它的作用是什么,当时就懵了,好记性不如烂笔头,所以今天就来总结一下函数柯里化。

什么是函数柯里化

函数柯里化(Currying) 是一种将多个参数的函数转换为一系列仅接受一个参数的函数的技术。

简单来说,柯里化将一个接收多个参数的函数,转化为接收单一参数的函数序列。每个函数接收一个参数并返回一个新函数,直到所有的参数都被接收,最终返回原函数的结果。

柯里化的基本形式

普通函数:直接接收多个参数并返回结果

1
2
3
function add(a, b, c) {
return a + b + c;
}

柯里化函数:返回一系列接收一个参数的函数,最后返回计算结果。每次调用函数时,它接收一个参数并返回一个新函数,直到所有参数都传入为止。
柯里化后的函数可以这样调用:

1
2
3
4
5
6
7
8
9
10
function curriedAdd(a) {
return function(b) {
return function(c) {
return a + b + c;
};
};
}

console.log(curriedAdd(1)(2)(3)); // 输出 6

柯里化的优势

  • 部分应用:允许你为函数传递一部分参数,并返回一个接收剩余参数的新函数。这在某些场景下(如事件处理、回调等)非常有用。
  • 参数复用:如果你有一个固定的参数,你可以先传递这个参数,然后复用返回的函数。
  • 提高代码可读性:让函数逻辑更加清晰、简洁,便于理解和测试。

柯里化的通用实现

封装一个通用的柯里化函数,可以将任何函数转换成柯里化的形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args); // 如果参数足够,直接调用原函数
} else {
return function(...newArgs) {
return curried.apply(this, args.concat(newArgs)); // 否则继续收集参数
};
}
};
}

// 使用示例
function multiply(a, b, c) {
return a * b * c;
}

const curriedMultiply = curry(multiply);

console.log(curriedMultiply(2)(3)(4)); // 输出 24
console.log(curriedMultiply(2, 3)(4)); // 输出 24
console.log(curriedMultiply(2)(3, 4)); // 输出 24

柯里化的应用场景

  • 事件处理:在 React 等框架中,处理事件时可以先绑定部分参数,然后在事件触发时再传递剩余参数。
  • 函数组合:柯里化可以方便地进行函数组合,让逻辑更加清晰和简洁。
  • 函数式编程:柯里化是函数式编程中的重要工具,它能将复杂的多参数函数转化为可复用的、参数明确的函数。