js函数组合
挑选多个函数,把它们拼接在一起,返回新函数,实现函数公共合作的效果。 将函数组合在一起,就像将一连串管道扣合在一起,让数据流过一样。简而言之,函数 f
和 g
的组合可以被定义为 f(g(x))
,从内到外(从右到左)求值。
function compose(f, g){
return function(x){
return f(g(x));
}
}
function toUpperCase(str){
return str.toUpperCase();
}
function add(str){
return str+"!";
}
var f = compose(add, toUpperCase);
f("hello");
函数组合,循环参数
function compose(){
var args = Array.prototype.slice.call(arguments);
var len = args.length - 1;
return function(x){
// 调用最后一个函数
var result = args[len](x)
while(len--){
result = args[len](result)
}
return result;
}
}
var f = compose(add, toUpperCase)
f("hello");
reduceRight优化
reduce/reduceRight
// 若init有值则start开始为init,此时next为数组第一个元素。否则start为数组第一个元素,此时next为数组第二个元素
array.reduce(callback(start, next, arr), init)
// reduceRight从后往前遍历
// 若init有值则start开始为init,此时next为数组最后一个元素。否则start为arr最后的值,此时next为倒数第二个元素
composeReduce实现
function composeReduce(){
var args = Array.prototype.slice.call(arguments);
return function(x){
return args.reduceRight((res, cb) => {
return cb(res);
}, x)
}
}
var f = composeReduce(add, toUpperCase)
f("hello");
继续优化
const composeReduce2 = (...args) => (x) => args.reduceRight((res, cb) => cb(res), x)
1
1
1
1
1
1
1
1
1
1