0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

js函数组合

修罗 2020-11-09 1448 0条评论 JS

首页 / 正文

js函数组合

挑选多个函数,把它们拼接在一起,返回新函数,实现函数公共合作的效果。 将函数组合在一起,就像将一连串管道扣合在一起,让数据流过一样。简而言之,函数 fg 的组合可以被定义为 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");

1604856692958.png

函数组合,循环参数

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");

1604857138440.png

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");

1604858250294.png

继续优化

const composeReduce2 = (...args) => (x) => args.reduceRight((res, cb) => cb(res), x)

1604858742098.png

评论(0)


最新评论

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • 1

    1

  • @@5Qa2D

    1

  • 1

    1

  • 1

    1

日历

2025年09月

 123456
78910111213
14151617181920
21222324252627
282930    

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis