将嵌套函数作为参数传递

时间:2014-05-30 17:15:28

标签: javascript functional-programming purely-functional

是否有嵌套函数的方式并将它们作为参数传递? 我有这两个功能:

function mayus(string) {
    return string.toUpperCase();
}

function removeA(string) {
    return string.replace(/A/g, "");
}

我希望以两种不同的方式应用它们

function stringHandler1(stringID) {
    var newString = mayus(removeA(getString(stringID))); 
    return newString;
}

function stringHandler2(stringID) {
    var newString = removeA(mayus(getString(stringID)));
    return newString;
}

2个stringHandlers返回略有不同的字符串,但它们非常相似。有没有办法使用一个带有2个参数的字符串处理程序(stringID和操作)

function stringHandlerINeed(string, operation) {
    var newString = operation(string);
    alert(newString);
}

我想做点什么

  

stringHandlerINeed(" 516af2",mayus(removeA))

更新 我标记了jJ'作为答案,因为它并不要求我改变我已经拥有的任何功能,而且它是我所寻找的概念,但是juvian的this answer如此简单让我希望我我想出来了。

3 个答案:

答案 0 :(得分:4)

我能想到的最好的方法是根据操作的顺序在数组中发送函数,然后一次评估每个函数:

function stringHandlerINeed(string, operation) {
    var newString=string;
    for(var i =0; i< operation.length;i++){
        newString=operation[i](newString);
    }
    alert(newString);
}


stringHandlerINeed("516af2", [mayus,removeA]) // alerts 516F2

答案 1 :(得分:2)

你真正想要的可能是功能组合 ......实现它的一种方法是:

function compose() {
    var fns = Array.prototype.slice.call(arguments);
    return function (arg) {
        fns.forEach(function (fn) {
            arg = fn(arg);
        });
        return arg;
    };
}

compose(mayus, removeA)('axA'); // -> "X"
compose(removeA, mayus)('axA'); // -> "AX"

这个概念有无穷无尽的应用。您可以使用compose中链接的任意数量的函数。您可以命名组合函数:

var mayusRemoveA = compose(mayus, removeA);

您还可以创建一个常量函数(类似于上面的处理程序)而不是通过直接调用组合函数来计算的值...

var theHandlerINeed = compose(function () { return 'axA'; }, mayus, removeA);

theHandlerINeed(); // -> "X"

答案 2 :(得分:1)

我和juvian的方向相同,但更简单。

在这个jsfiddle(http://jsfiddle.net/4J2AH/)中,我传入了我想要操作的字符串和函数,然后执行这些操作并返回新字符串。

stringHandlerINeed("516af2", mayus(removeA))的问题是,当你调用mayus(removeA)时,这意味着你实际上正在调用传入另一个函数的mayus函数。当它转到大写一个函数时,javascript会抛出一个错误。