1,组合函数是自右向左,依此执行,左倾原则
( 函数通道就是自左向右。)
function toUpperCase(str) {
return str.toUpperCase();
}
function add(str) {
return str + "!";
}
function split(str) {
return str.split("-");
}
function reverse(str) {
return str.reverse();
}
function compose() {
var args = [].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, reverse, split, toUpperCase);
console.log(f("time"));
2,优化这个函数
- 用到了这个函数的结果作为下一个函数的输入,用reduce函数优化
- Array.prototype.reduce = function (cb, init);
- cb(prev, next, index, arr);
- prev为上一个回调函数返回的结果,如果传了init那么prev初始值就是init的值,如果没有传init那么prev初始值就是数组第0位
- Array.prototype.reduceRight = function (cb, init);
- cb(prev, next, index, arr);
- reduceRight 就是从数组的有右边开始执行,那么prev就是数组最后一位,next就是数组倒数第二位
- 函数组合就是自右向左执行的,那么reduceRight符合。
function compose1() {
var args = [].slice.call(arguments);
var len = args.length - 1;
return function (x) {
return args.reduceRight(function (res, cb) {
return cb(res);
}, x)
}
}
var f1 = compose1(add, reverse, split, toUpperCase);
console.log(f1("time"));
3,优化函数用ES6语法
const compose2 = (...args) => x => args.reduceRight((res, cb) => cb(res), x);
var f2 = compose2(add, reverse, split, toUpperCase);
console.log(f2("time"));
function pipe() {
var args = [].slice.call(arguments);
var len = args.length - 1;
return function (x) {
return args.reduce(function (res, cb) {
return cb(res);
}, x)
}
}
var f3 = pipe(toUpperCase, split, reverse, add);
console.log(f3("time"));