Come posso eseguire il binding a destra della funzione? Esempio:Javascript: vincola a destra di una funzione?
var square = Math.pow.bindRight(2);
console.log(square(3)); //desired output: 9
Come posso eseguire il binding a destra della funzione? Esempio:Javascript: vincola a destra di una funzione?
var square = Math.pow.bindRight(2);
console.log(square(3)); //desired output: 9
Stai cercando funzioni parziali, che sono comodi abbreviazioni per gli alias.
Il modo "classico" di fare quello che stai chiedendo è con:
var square = function (x) {
return Math.pow(x, 2);
};
Utilizzando funzioni parziali sarebbe:
var square = Math.pow.partial(undefined, 2);
console.log(square(3));
Purtroppo, Function.prototype.partial
non è fornito in alcun browser.
Fortunatamente per voi, ho lavorato in una libreria di quello che io considero essere essenziali object oriented funzioni JavaScript, metodi, classi, ecc Questo è 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);
};
};
}
}());
Cosa c'è di sbagliato con:
var square = function(x) {return x*x;};
Per rispondere alla domanda correttamente, è necessario creare una funzione anonima che chiama la funzione "legato" con un set di parametri, come ad esempio:
var square = function(x) {return Math.pow(x,2);};
In questo modo, è possibile associare qualsiasi numero di parametri, riorganizzare i parametri o una combinazione dei due. Tuttavia, tieni presente che l'impatto sulle prestazioni è notevole, poiché aggiungi una chiamata di funzione in più allo stack ogni volta che ti leghi in questo modo.
Intendi solo con il fatto che sta chiedendo qualcos'altro? – gdoron
Devo supporre, quindi, che sia un cattivo esempio, poiché questa risposta risolve molto chiaramente il problema nell'esempio fornito. –
L'esempio fornito non era il caso da risolvere, era solo un esempio in modo da poter capire di cosa ho bisogno. Ci dispiace, ma non lo farà, anche se l'intenzione è buona. – MaiaVictor
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
In realtà mi aspettavo un'implementazione usando la libreria standard o una libreria popolare. Sembra che non ci sia, però, quindi questa è la risposta giusta. Grazie. – MaiaVictor
Sembra che tu voglia un'applicazione parziale. Ci sono un certo numero di librerie che forniscono questo, tra cui underscore.js: http://documentcloud.github.com/underscore/
Lodash di partialRight
farà ciò che si vuole, e qui è la documentazione:
This method is like _.partial except that partial arguments are appended to those provided to the new function. Arguments func (Function): The function to partially apply arguments to. [arg] (…*) : Arguments to be partially applied. Returns (Function): Returns the new partially applied function.
si può fare con partial
from underscore.js, passando _
come segnaposto, da riempire in seguito:
var square = _.partial(Math.pow, _, 2);
console.log(square(3)); // => 9
Questa funzione è apparso nel mese di febbraio 2014 (sottolineatura 1.6.0).
Non avevo mai visto questa risposta prima. Questa è in realtà la soluzione migliore. Grazie. – MaiaVictor
Vedere anche la soluzione di 'partialRight()' di lodash nella risposta di @ brian-m-hunt sotto – Offirmo