1

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

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 的这个答案是如此简单,让我希望我已经提出用它。

4

3 回答 3

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
于 2014-05-30T17:29:13.700 回答
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"
于 2014-06-01T18:56:07.303 回答
1

我走的是与juvian相同的方向,但更简单。

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

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

于 2014-05-30T17:43:01.973 回答