1

関数をネストしてパラメーターとして渡す方法はありますか? 私はこの2つの機能を持っています:

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

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

2つの異なる方法でそれらを適用したい

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

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

2 つの stringHandler はわずかに異なる文字列を返しますが、かなり似ています。2 つのパラメーター (stringID と操作) を取る 1 つの文字列ハンドラーを使用する方法はありますか?

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

私は何かをしたい

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

更新: jJ' を回答 としてマークしました。これは、既に持っている機能を変更する必要がなく、探していた概念であるためです。それと。

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

あなたが本当に欲しいのは、おそらく関数合成です...それを実装する1つの方法は次のようになります:

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

私はジュビアンと同じ方向に進んでいましたが、より単純でした。

この jsfiddle ( http://jsfiddle.net/4J2AH/ ) では、操作対象の文字列と関数を渡し、それらの操作を実行して新しい文字列を返します。

問題stringHandlerINeed("516af2", mayus(removeA))は、mayus(removeA) を呼び出すと、別の関数を渡す mayus 関数を実際に呼び出していることを意味します。関数を大文字にすると、javascript はエラーをスローします。

于 2014-05-30T17:43:01.973 に答える