Javascript 将嵌套函数作为参数传递

Javascript 将嵌套函数作为参数传递,javascript,functional-programming,purely-functional,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(getStrin

有没有办法嵌套函数并将其作为参数传递? 我有两个功能:

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;
}
这两个StringHandler返回的字符串略有不同,但它们非常相似。有没有一种方法可以使用一个字符串处理程序来接受两个参数:stringID和操作

function stringHandlerINeed(string, operation) {
    var newString = operation(string);
    alert(newString);
}
我想做一些像

纵梁扶手线516AF2,Mayusremova

更新:
我将jJ标记为答案,因为它不需要我更改我已经拥有的任何函数,这是我一直在寻找的概念,但通过juvian,它如此简单,让我希望我已经想出了它。

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

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

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

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

我走的是和朱维亚相同的方向,但更简单

在这个JSFIDLE中,我传入了我想要操作的字符串和函数,然后执行这些操作并返回新字符串


StringHandlerined516AF2,mayusremoveA的问题在于,当您调用mayusremoveA时,这意味着您实际上正在调用正在传递另一个函数的mayus函数。当它转到大写的函数时,javascript将抛出一个错误

我和朱维亚人走的是同一个方向,但更简单

在这个JSFIDLE中,我传入了我想要操作的字符串和函数,然后执行这些操作并返回新字符串


StringHandlerined516AF2,mayusremoveA的问题在于,当您调用mayusremoveA时,这意味着您实际上正在调用正在传递另一个函数的mayus函数。当它转到大写的函数时,javascript将抛出一个错误

您真正想要的可能是函数合成。。。实现它的一种方法如下:

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"

你真正想要的可能是函数合成。。。实现它的一种方法如下:

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"