# 1、compose函数

  是一种以函数作为输入参数的函数,且函数执行顺序是从右到左。调用后返回的还是一个函数,跟偏函数和柯里化函数有点像。具体实现过程如下。

//compose函数实现方式1
function compose(...funs){
    const len=funs.length;
    if(len===0) return x=>x;
    if(len===1) return funs[0];
    return function(args){
        let res=args;
        for(let i=fns.length;i--;){
            res=fns[i](res);
        }
        return res;
    }
}
//compose函数实现方式2
function compose(...funs){
    const len=funs.length;
    if(len===0) return x=>x;
    if(len===1) return funs[0];
    return funs.reduce((cur,next)=>{
        return (arg)=>cur(next(arg))
    })
}
// compose函数实现方式3
function compose(...funs){
    const len=funs.length;
    if(len===0) return x=>x;
    if(len===1) return funs[0];
    return (...arg)=>{
        //也可以 funs.reverse().reduce()
        return funs.reduceRight((cur,next)=>{
            return next(...cur);
        },arg)
    }
}
function add(x){
    return x+5;
};
function multyply(x){
    return x*5;
}
function minus(x){
    return x-5;
}
let fn1=compose(add,multyply,minus);
console.log(fn1(10));//30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

# 2、pipe函数

  是一种以函数作为输入参数的函数,且函数执行顺序是从左到右。

//pipe函数
function pipe(){
    const fns=[].slice.call(arguments);
    return function(args){
        let res=ars;
        for(let i=0;i<fns.length;i++){
            res=fns[i](res);
        }
        return res;
    }
}
//pipe函数实现方式2
function pipe(...funs){
    const len=funs.length;
    if(len===0) return x=>x;
    if(len===1) return funs[0];
    return funs.reduce((cur,next)=>{
        return (arg)=>next(cur(arg))
    })
}
//实践
function add(x){
    return x+5;
};
function multyply(x){
    return x*5;
}
function minus(x){
    return x-5;
}
let fn1=compose(add,multyply,minus);
console.log(fn1(10));//30
let fn2=pipe(add,multyply,minus);
console.log(fn2(10));//70

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Last Updated: 10/22/2020, 2:29:43 PM