Javascript: liaison à droite d'une fonction?

Comment puis-je me lier à droite de la fonction? Exemple:

var square = Math.pow.bindRight(2); console.log(square(3)); //desired output: 9 

Vous recherchez des fonctions partielles, qui sont des raccourcis pratiques pour les alias.

La façon «classique» de faire ce que vous demandez est avec:

 var square = function (x) { return Math.pow(x, 2); }; 

En utilisant des fonctions partielles, ce serait:

 var square = Math.pow.partial(undefined, 2); console.log(square(3)); 

Malheureusement, Function.prototype.partial n'est pas fourni dans aucun navigateur.


Heureusement pour vous, j'ai travaillé sur une bibliothèque de ce que je considère comme essentiel, les fonctions orientées objet JavaScript, les méthodes, les classes, etc. Ceci est Function.prototype.partial.js :

 /** * @dependencies * Array.prototype.slice * Function.prototype.call * * @return Function * returns the curried function with the provided arguments pre-populated */ (function () { "use strict"; if (!Function.prototype.partial) { Function.prototype.partial = function () { var fn, argmts; fn = this; argmts = arguments; return function () { var arg, i, args; args = Array.prototype.slice.call(argmts); for (i = arg = 0; i < args.length && arg < arguments.length; i++) { if (typeof args[i] === 'undefined') { args[i] = arguments[arg++]; } } return fn.apply(this, args); }; }; } }()); 
 Function.prototype.bindRight = function() { var self = this, args = [].slice.call( arguments ); return function() { return self.apply( this, [].slice.call( arguments ).concat( args ) ); }; }; var square = Math.pow.bindRight(2); square(3); //9 

Le droit partialRight de Lodash fera ce que vous voulez, et voici la documentation:

 Cette méthode est comme _.partial sauf que les arguments partiels
 Sont ajoutés à ceux fournis à la nouvelle fonction.

 Arguments
       Func (Fonction): La fonction permet d'appliquer partiellement les arguments à.
       [Arg] (... *): Arguments à appliquer partiellement.
 Renvoie (Fonction): renvoie la nouvelle fonction partiellement appliquée.

Cela semble être une application partielle. Il existe un certain nombre de bibliothèques qui fournissent cela, y compris underscore.js: http://documentcloud.github.com/underscore/

Vous pouvez le faire avec partial partir de underscore.js , en passant _ comme un espace réservé, pour être rempli plus tard:

 var square = _.partial(Math.pow, _, 2); console.log(square(3)); // => 9 

Cette fonctionnalité est apparue en février 2014 (soulignement 1.6.0 ).

Quel est le problème avec:

 var square = function(x) {return x*x;}; 

Pour répondre correctement à la question, vous devez créer une fonction anonyme qui appelle la fonction «lié» avec un paramètre défini, par exemple:

 var square = function(x) {return Math.pow(x,2);}; 

De cette manière, vous pouvez lier n'importe quel nombre de paramètres, réarranger les paramètres ou une combinaison des deux. Cependant, gardez à l'esprit qu'il y a un impact sur la performance, car vous ajoutez un appel de fonction supplémentaire à la pile chaque fois que vous liez comme ça.