JavaScript中的函数组合

时间:2015-03-03 00:08:11

标签: javascript functional-programming

功能组合实现在诸如下划线,低速冲刺等其他库中的好处是什么,类似于这一点:

var compose = function() {
    var funcs = arguments;

    return function() {
        var args = arguments;
        for (var i = funcs.length; i --> 0;) {
            args = [funcs[i].apply(this, args)];
        }
        return args[0];
    }
};

var c = compose(trim, capitalize);

与此相比:

var c = function (x) { return capitalize(trim(x)); };

后者的表现更为出色。

2 个答案:

答案 0 :(得分:2)

首先,它更容易阅读。性能很少比这更重要。此外,您可以制作具有几乎相同性能的专用arity 2功能。

另一个好处是可以在运行时轻松更改构图。您可以创建在大小写之前修剪的版本,修剪前大写,仅修剪,仅大写,或两者都不需要,而无需在代码中明确指定每个组合。这有时可以大大简化您的代码。运行时组合是你一直不想要的事情之一。

例如:

var c = function(x) {return x;} // identity
var onTrimClick          = function() {c = compose(c, trim);}
var onCapitalizeClick    = function() {c = compose(c, capitalize);}
var onSomethingElseClick = function() {c = compose(c, somethingElse);}

这使您可以在运行时根据用户点击的内容和顺序创建组合函数c

答案 1 :(得分:0)

//A simple way to understand javascript function composition =>

function composition(...fun) {
    return function (value) {
        var functionList = fun.slice();
        while (functionList.length > 0) {
            value = functionList.pop()(value);
        }
        return value;
    }
}

function mult2(value) {
    return value * 2;
}

function mult3(value) {
    return value * 3;
}

function mult5(value) {
    return value * 5;
}

var composedFun = composition(mult2, mult3, mult5);
console.log(composedFun);
console.log(composedFun(1));
console.log(composedFun(2));