定义

柯里化,英语:Currying,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

很拗口是吧,看看下面的例子就明白了:

  1. // 这是我们原始的increment函数
  2. function increment(a, b) {
  3. return a + b
  4. }
  5. console.log(increment(1, 2)) // 3

将increment函数柯里化后是这样的:

  1. function curryingIncrement(a) {
  2. return function(b) {
  3. return a + b
  4. }
  5. }
  6. console.log(curryingIncrement(1)(2)) // 3

实际上就是把increment函数的a, b两个参数变成了:先用一个函数接受a,然后返回一个函数处理b参数。
也就是只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

好处

你可能会觉得上边的代码是脱裤子放*,有啥好处呢?接下来我们来列一列柯里化的好处。

  • 复用参数
  • 柯里化可以让我们构建更简单、可重用的组件 ```javascript // 参数重用的案例 const add = a => b => a + b const add1 = add(1)

// add(1, 3) add(1, 13) add(1, 23) // 这里我的第一个参数是一样的 都是1 是没必要重复传递的 // 可以通过柯里化实现参数的复用 const res1 = add1(3) const res2 = add1(13) const res3 = add1(23)

console.log(res1, res2, res3) // 4 14 24

  1. - 复杂逻辑切分成细节,易于发现问题
  2. - 使得函数可以直接通过map等方法被数据调用
  3. ```javascript
  4. const add = a => b => a + b
  5. let arr = [1, 2, 3, 4]
  6. const res1 = arr.map(add(1))
  7. const res2 = arr.map(add(1)).map(add(2))
  8. console.log('res1: ', res1); // res1: [ 2, 3, 4, 5 ]
  9. console.log('res2: ', res2); // res2: [ 4, 5, 6, 7 ]

lodash的curry函数

我们可以使用lodash的curry函数将我们自己的函数实现柯里化
lodash文档curry函数

const _ = require('lodash');
const add = (a, b, c) => a + b * c
const curryAdd = _.curry(add);

console.log(curryAdd(1)(2)(3)) // 7
console.log(curryAdd(1, 2)(3)) // 7
console.log(curryAdd(1, 2, 3)) // 7
console.log(curryAdd(1)(_, 2)(3)) // 7