# 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
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
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