函数组合应用

1,组合函数是自右向左,依此执行,左倾原则

( 函数通道就是自左向右。)
// function compose(f, g) {
//     return function (x) {
//         return f(g(x));
//     }
// }
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);//将类数组arguments变成数组,
    var len = args.length - 1;//最后一个函数
    return function (x) {
        // args[len](x)             //最后一个函数执行
        // args[len - 1](args[len](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函数优化
  1. Array.prototype.reduce = function (cb, init);
    • cb(prev, next, index, arr);
    • prev为上一个回调函数返回的结果,如果传了init那么prev初始值就是init的值,如果没有传init那么prev初始值就是数组第0位
  2. Array.prototype.reduceRight = function (cb, init);
    • cb(prev, next, index, arr);
    • reduceRight 就是从数组的有右边开始执行,那么prev就是数组最后一位,next就是数组倒数第二位
  3. 函数组合就是自右向左执行的,那么reduceRight符合。
function compose1() {
    var args = [].slice.call(arguments);//将类数组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"));


// 函数通道:自左向右,与函数组合的函数执行相反。那么就使用reduce,而不使用reduceRight
function pipe() {
    var args = [].slice.call(arguments);//将类数组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"));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值