1. 柯里化:
      1. 当函数有多个参数的时候,我们可以对函数进行改造。我们可以调用一个函数,只传递部分的参数(这部分参数以后永远不变),然后让这个函数返回一个新的函数。新的函数传递剩余的参数,并且返回相应的结果。
      2. 柯里化可以把一个多元函数转化成一元函数
      3. 解决硬编码的问题
      4. 可以最大程度的重用我们的函数
      5. 纯函数和柯里化很容易写出洋葱代码 ```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

    1. 2. 柯里化模拟:
    2. 实现一个柯里化转换函数要进行分析
    3. 1. 入参出参:调用传递一个纯函数的参数,完成之后返回一个柯里化函数
    4. 1. 入参情况分析:
    5. - 如果curried调用传递的参数和getSum函数参数个数相同,那么立即执行并返回调用结果
    6. - 如果curried调用传递的参数是getSum函数的部分参数,那么需要返回一个新的函数,并且等待接收getSum的其他参数
    7. 3. 重点关注:
    8. - 获取调用的参数
    9. - 判断个数是否相同
    10. ```javascript
    11. // 模拟柯里化函数
    12. function curry (func) {
    13. // 取名字是为了下面实参小于形参的时候用的
    14. return function curriedFn(...args) {
    15. // 判断实参和形参的个数
    16. if(args.length < func.length) {
    17. return function() {
    18. // 等待传递的剩余参数,如果剩余函数的参数加上之前的参数等于形参,那么就返回func
    19. // 第一部分参数在args里面,第二部分参数在arguments里面,要将两个合并并且展开传递(使用...)
    20. // concat函数要合并两个数组,arguments为伪数组,所以用Array.from进行转换
    21. return curriedFn(...args.concat(Array.from(arguments)))
    22. }
    23. }
    24. // 如果实参大于等于形参的个数
    25. // args是剩余参数,是个数组形式,而返回的时候要展开(使用...)
    26. return func(...args)
    27. }
    28. }
    29. // test
    30. const curriedTest = curry(getSum)
    31. console.log(curriedTest(1, 2, 3)) // 6
    32. console.log(curriedTest(1)(2, 3)) // 6
    33. console.log(curriedTest(1, 2)(3)) //