08-函数式编程

6/22/2022

# 1. 柯里化

<script>
    // 未柯里化的函数
    function add(x,y,z){
        return x+y+z;
    }
    console.log(add(20,10,30));
    
    // 柯里化处理的函数
    function add2(x){
        return function(y){
            return function(z){
                return x+y+z;
            }
        }
    }
    console.log(add2(10)(20)(30));
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  • 经过柯里化处理的函数,可以简写:
<script>
    let add2 = x=>y=>z=>x+y+z;
    console.log(add2(10)(20)(30));
</script>
1
2
3
4

JS中函数的柯里化,我的认为:
只传递给函数一部分参数来调用它,让它返回一个函数去处理剩余的参数,这个过程,就是柯里化。

函数式编程:

  • 让函数职责更加单一,在函数式编程,我们希望,一个函数处理问题尽可能单一,而不是将一大堆的处理过程交给一个函数来处理,所以,我们给函数传入的参数,应该非常灵活,可以先传入一部分参数,处理完后,再传其它参数。
<script>
    // 没有经过柯里化处理
    function add(x,y,z){
        x = x+2;
        y = y*2;
        z = z*z;
        //.... 
        return x+y+z;
    }
    console.log(add(1,2,3));

    // 把上面的函数进行柯化里处理
    function add2(x){
        x = x+2;
        return function(y){
            y = y*2;
            return function(z){
                z = z*z;
                return x+y+z;
            }
        }
    }
    console.log(add2(1)(2)(3));
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  • 柯里化可以复用代码,如下:
<script>
    function sum(m,n){
        return m+n;
    }
    console.log(sum(10,1));
    console.log(sum(10,2));
    console.log(sum(10,3));
    console.log(sum(10,4));

    function sum2(count){
        return function (num){
            return count + num;
        }
    }
    let makeSum = sum2(10)
    console.log(makeSum(1));
    console.log(makeSum(2));
    console.log(makeSum(3));
    console.log(makeSum(4));
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 2. 组合函数

我们要完成一个功能,需要调用两个函数才能实现,之前,就是依次调用这两个函数。那么我们每一次要用这个功能,就需要调用两次函数,操作上有点重复,能不能把这个函数组合成一个函数呢?

  • 答:可以的

可以对两个多个函数进行组合,组合后的函数,我们叫组合函数。

<script>
    function double(num){
        return num*2;
    }
    function square(num){
        return num ** 2;
    }
    // console.log(double(10));
    // console.log(square(10));

    // 需求:给一个数字,先乘以2,再平方
    let count = 12;
    let res = square(double(count))
    console.log(res);
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Last Updated: 12/25/2022, 10:02:14 PM