Comment puis-je passer une référence à une fonction, avec des paramètres?

Duplication possible:
Comment puis-je préétablir les arguments dans l'appel de la fonction JavaScript? (Application de fonction partielle)

J'ai besoin de passer une référence à une fonction avec un ensemble de paramètres donné .

Voici un exemple de passage d'une référence sans paramètres:

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 

Maintenant, ce que je dois faire est de passer la même fonction f , mais cette fois, je devrais passer des paramètres à la référence. Maintenant, je peux le faire avec une fonction anonyme et invoquer la fonction f avec des paramètres dans la fonction nouvellement créée, comme tel:

 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 

Mais ma question est: Y at-il un moyen de passer une référence directe à la fonction f Avec des paramètres à fr , mais sans l'enfermer dans une fonction anonyme?

Qu'ai-je besoin d'affecter à fr pour le rendre invokable sans paramètres ( fr() ), de sorte que f (1,2,3) soit exécuté lorsque fr est invoqué?

[MISE À JOUR] J'ai suivi la réponse de Jason Bunting à propos de la fonction partielle et de la fonction JavaScript qu'il publie, c'est exactement ce que je cherchais. Voici la solution:

 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); }; } 

Ce que vous appelez est appelé application de fonction partielle .

Ne vous laissez pas tromper par ceux qui ne comprennent pas la différence subtile entre cela et le curry, ils sont différents.

L'application de fonction partielle peut être utilisée pour la mise en œuvre, mais elle n'est pas curry. Voici une citation d' un blog sur la différence :

Lorsque une application partielle prend une fonction et crée une fonction qui prend moins d'arguments, currying crée des fonctions qui prennent plusieurs arguments par composition de fonctions qui prennent chacun un seul argument.

Cela a déjà été répondu, voir cette question pour votre réponse: Comment puis-je préétablir les arguments dans l'appel de fonction JavaScript?

Exemple:

 var fr = partial(f, 1, 2, 3); // now, when you invoke fr() it will invoke f(1,2,3) fr(); 

Encore une fois, voir cette question pour les détails.

Vous pouvez également surcharger le prototype Fonction:

 // 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 ); }; }; /* eg 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 */ 

Ce qui suit équivaut à votre deuxième bloc de code:

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

Si vous voulez effectivement transmettre une référence à une fonction à une autre fonction, vous pouvez faire quelque chose comme ceci:

 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 

Vous êtes certainement mieux d'utiliser un cadre pour ce genre de chose, cependant.