パラメーターを使用して関数への参照を渡すにはどうすればよいですか?[重複]
-
22-08-2019 - |
質問
できる必要があります 指定されたパラメータのセットを持つ関数への参照を渡します.
これは参照を渡す例です それなし パラメーター:
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
しかし、私の質問は、 に直接参照を渡す方法はありますか? f
関数 パラメーター付き fr
, 、しかしそれを匿名関数で囲まずに?
何を割り当てる必要がありますか fr
パラメーターなしで呼び出せるようにするには (fr()
)、次のときに f(1,2,3) が実行されるようにします。 fr
呼び出されますか?
[アップデート] 私はついていきます ジェイソン・バンティングさんの答え ここ 関して 部分的な機能 そして、彼がそこに投稿した 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);
};
}
解決
あなたが求めているものは呼ばれます 部分的な機能の適用.
それとカレーの微妙な違いを理解していない人に騙されないでください。 は 違う。
部分的な機能応用でも実装可能ですが、 ではありません カリー化。ここからの引用です 違いに関するブログ投稿:
部分適用では関数を受け取り、そこから引数の少ない関数を構築しますが、カリー化では、それぞれが 1 つの引数を取る関数を合成することで複数の引数を取る関数を構築します。
これはすでに回答されています。回答については、この質問を参照してください。 JavaScript 関数呼び出しで引数を事前に設定するにはどうすればよいですか?
例:
var fr = partial(f, 1, 2, 3);
// now, when you invoke fr() it will invoke f(1,2,3)
fr();
繰り返しになりますが、詳細についてはその質問を参照してください。
他のヒント
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
*/
以下は 2 番目のコード ブロックと同等です。
var f = function () {
//Some logic here...
};
var fr = f;
fr(pars);
実際に関数への参照を他の関数に渡したい場合は、次のようなことができます。
function fiz(x, y, z) {
return x + y + z;
}
// elsewhere...
function foo(fn, p, q, r) {
return function () {
return fn(p, q, r);
}
}
// finally...
f = foo(fiz, 1, 2, 3);
f(); // returns 6
ただし、この種のことにはフレームワークを使用した方が良いのはほぼ間違いありません。