【问题标题】:Function composition in JavaScriptJavaScript 中的函数组合
【发布时间】:2015-05-03 12:16:49
【问题描述】:

在下划线、lo-dash 等库中实现函数组合有什么好处,类似于这个:

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

后者的性能要好得多。

【问题讨论】:

  • 简洁明了。如果您受到性能的严格限制 - 无论如何,您更喜欢速度而不是“可读性”。
  • 我看不出你如何比较这两者......
  • c 为每个 (?) 输入生成相同的结果。为什么你认为它没有可比性?

标签: javascript functional-programming


【解决方案1】:

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

【讨论】:

    【解决方案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

    【讨论】:

    • 您所说的“可以在运行时轻松更改组合”是什么意思?
    猜你喜欢
    • 2016-08-08
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多