定义:
**函数组合:**由若干个纯函数、偏函数、柯里化函数组合成一个新的函数,同时,形成数据传递。
用途:
挑选了一系列所需要的函数,把他们组合在一起,可以实现公共合作的效果
最基本的函数组合:
function compose (fn,gn){ //fn gn 是两个函数
return function (xn){
return fn( gn(xn) ); //自右向左依次执行,称为左倾,使得x自右向左传递
}
}
此时的compose函数不具有普遍意义,我们稍作修改:
function compose(){
var args = Array.prototype.slice.call(arguments); // 把这个变成数组操作
var len = args.length - 1;
return function (x){
// args[len](x)
var result = args[len](x);
while(len--){
result = args[len](result);
}
return result;
}
}
然后reduce优化代码:
function compose1(){
var args = Array.prototype.slice.call(arguments);
var len = args.length - 1;
return function (x){
return args.reduceRight(function (res,cb) {
return cb(res);
},x);
}
}
ES6.0写法:
const compose2 = (...args) => x => args.reduceRight((res,cb) => cb(res) , x);
自左向右同理处理,通常称为“通道”,写法把reduceRight缓存reduce就行
function compose3(){
var args = Array.prototype.slice.call(arguments);
var len = args.length - 1;
return function (x){
return args.reduce(function (res,cb) {
return cb(res);
},x);
}
}
例子(简单):实现字符串翻转后用-分割
var newCompose = compose3(toUpperCase,split,reverse);
var ans = newCompose('time');