94

重複の可能性:
JavaScript 関数呼び出しで引数を事前に設定するにはどうすればよいですか? (部分機能適用)

指定された一連のパラメーターを持つ関数への参照を渡すことができる必要があります。

パラメータなしで参照を渡す例を次に示します。

var f = function () {
    //Some logic here...
};

var fr = f; //Here I am passing a reference to function 'f', without parameters
fr(); //the 'f' function is invoked, without parameters

次に、同じf関数を渡す必要がありますが、今回はパラメーターを参照に渡す必要があります。今、私は無名関数でそれを行うことができ、次fのように、新しく作成された関数内のパラメーターを使用して関数を呼び出すことができます。

var f = function () {
        //Some logic here...
    };

var fr = function (pars) {
    f(pars);
}; //Here I am creating an anonymous function, and invoking f inside it

fr({p : 'a parameter'}); //Invoking the fr function, that will later invoke the f function with parameters

しかし、私の質問は、パラメータを使用して関数への直接参照を渡す方法はありますが、匿名関数で囲むことはありませんか?ffr

が呼び出されたときに f(1,2,3) が実行されるように、frパラメーター ( ) なしで呼び出し可能にするには、何を割り当てる必要がありますか?fr()fr

[UPDATE]私はジェイソン・バンティングの部分関数についてのここへの回答 に従いました。彼がそこに投稿した JavaScript 関数はまさに私が探していたものです。解決策は次のとおりです。

function partial(func /*, 0..n args */) {
  var args = Array.prototype.slice.call(arguments).splice(1);
  return function() {
    var allArguments = args.concat(Array.prototype.slice.call(arguments));
    return func.apply(this, allArguments);
  };
}
4

3 に答える 3

2

Function プロトタイプをオーバーロードすることもできます。

// partially applies the specified arguments to a function, returning a new function
Function.prototype.curry = function( ) {
    var func = this;
    var slice = Array.prototype.slice;
    var appliedArgs = slice.call( arguments, 0 );

    return function( ) {
        var leftoverArgs = slice.call( arguments, 0 );
        return func.apply( this, appliedArgs.concat( leftoverArgs ) );
    };
};

// can do other fancy things:

// flips the first two arguments of a function
Function.prototype.flip = function( ) {
    var func = this;
    return function( ) {
        var first = arguments[0];
        var second = arguments[1];
        var rest = Array.prototype.slice.call( arguments, 2 );
        var newArgs = [second, first].concat( rest );

        return func.apply( this, newArgs );
    };
};

/*
e.g.

var foo = function( a, b, c, d ) { console.log( a, b, c, d ); }
var iAmA = foo.curry( "I", "am", "a" );
iAmA( "Donkey" );
-> I am a Donkey

var bah = foo.flip( );
bah( 1, 2, 3, 4 );
-> 2 1 3 4
*/
于 2012-01-07T11:51:26.333 に答える