定义
柯里化,英语:Currying,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
很拗口是吧,看看下面的例子就明白了:
// 这是我们原始的increment函数
function increment(a, b) {
return a + b
}
console.log(increment(1, 2)) // 3
将increment函数柯里化后是这样的:
function curryingIncrement(a) {
return function(b) {
return a + b
}
}
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
- 复杂逻辑切分成细节,易于发现问题
- 使得函数可以直接通过map等方法被数据调用
```javascript
const add = a => b => a + b
let arr = [1, 2, 3, 4]
const res1 = arr.map(add(1))
const res2 = arr.map(add(1)).map(add(2))
console.log('res1: ', res1); // res1: [ 2, 3, 4, 5 ]
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