- 柯里化:
- 当函数有多个参数的时候,我们可以对函数进行改造。我们可以调用一个函数,只传递部分的参数(这部分参数以后永远不变),然后让这个函数返回一个新的函数。新的函数传递剩余的参数,并且返回相应的结果。
- 柯里化可以把一个多元函数转化成一元函数
- 解决硬编码的问题
- 可以最大程度的重用我们的函数
- 纯函数和柯里化很容易写出洋葱代码 ```javascript // 下面这段代码是解决了不纯的函数的问题,但是里面出现了硬编码 function checkAge (age) { let mini = 18 return age >= mini }
// 普通的纯函数 function checkAge (min, age) { return age >= min } // 经常使用18,这段代码是重复的。避免重复 function checkAge (min) { return function (age) { return age >= min } }
let checkAge18 = checkAge(18) let checkAge20 = checkAge(20)
console.log(checkAge18(20)) //true console.log(checkAge18(24)) //true
2. 柯里化模拟:
实现一个柯里化转换函数要进行分析
1. 入参出参:调用传递一个纯函数的参数,完成之后返回一个柯里化函数
1. 入参情况分析:
- 如果curried调用传递的参数和getSum函数参数个数相同,那么立即执行并返回调用结果
- 如果curried调用传递的参数是getSum函数的部分参数,那么需要返回一个新的函数,并且等待接收getSum的其他参数
3. 重点关注:
- 获取调用的参数
- 判断个数是否相同
```javascript
// 模拟柯里化函数
function curry (func) {
// 取名字是为了下面实参小于形参的时候用的
return function curriedFn(...args) {
// 判断实参和形参的个数
if(args.length < func.length) {
return function() {
// 等待传递的剩余参数,如果剩余函数的参数加上之前的参数等于形参,那么就返回func
// 第一部分参数在args里面,第二部分参数在arguments里面,要将两个合并并且展开传递(使用...)
// concat函数要合并两个数组,arguments为伪数组,所以用Array.from进行转换
return curriedFn(...args.concat(Array.from(arguments)))
}
}
// 如果实参大于等于形参的个数
// args是剩余参数,是个数组形式,而返回的时候要展开(使用...)
return func(...args)
}
}
// test
const curriedTest = curry(getSum)
console.log(curriedTest(1, 2, 3)) // 6
console.log(curriedTest(1)(2, 3)) // 6
console.log(curriedTest(1, 2)(3)) //