定義:
**函數組合:**由若干個純函數、偏函數、柯里化函數組合成一個新的函數,同時,形成數據傳遞。
用途:
挑選了一系列所需要的函數,把他們組合在一起,可以實現公共合作的效果
最基本的函數組合:
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');