¿Cómo puedo enlazar a la derecha de la función? Ejemplo:Javascript: ¿vinculante a la derecha de una función?
var square = Math.pow.bindRight(2);
console.log(square(3)); //desired output: 9
¿Cómo puedo enlazar a la derecha de la función? Ejemplo:Javascript: ¿vinculante a la derecha de una función?
var square = Math.pow.bindRight(2);
console.log(square(3)); //desired output: 9
Está buscando funciones parciales, que son convenientes shorthands para alias.
La forma "clásica" de hacer lo que estás pidiendo es con:
var square = function (x) {
return Math.pow(x, 2);
};
Uso de las funciones parciales sería:
var square = Math.pow.partial(undefined, 2);
console.log(square(3));
Desafortunadamente, Function.prototype.partial
no se proporciona en cualquiera navegador.
Afortunadamente para ti, he estado trabajando en una biblioteca de lo que considero que son esenciales funciones de JavaScript orientado a objetos, métodos, clases, etc. Esto es 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);
};
};
}
}());
¿Qué hay de malo en:
var square = function(x) {return x*x;};
Para responder a la pregunta correctamente, es necesario crear una función anónima que llama a la función "atado" con un conjunto de parámetros, tales como:
var square = function(x) {return Math.pow(x,2);};
De esta manera, puede vincular cualquier cantidad de parámetros, reorganizar los parámetros o una combinación de ambos. Sin embargo, tenga en cuenta que hay un cierto impacto en el rendimiento, ya que está agregando una función extra llamada a la pila cada vez que se enlaza así.
¿Quiere decir excepto que él está pidiendo algo más? – gdoron
Voy a tener que asumir, entonces, que es un mal ejemplo, ya que esta respuesta resuelve el problema muy claramente en el ejemplo dado. –
El ejemplo dado no era el caso para ser resuelto, era simplemente un ejemplo para que pudieras entender lo que necesito. Lo siento, pero esto no lo hará, aunque la intención sea buena. – 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
Realmente esperaba una implementación usando la biblioteca estándar o una biblioteca popular. Parece que no lo hay, así que esta es la respuesta correcta. Gracias. – MaiaVictor
Parece que desea una aplicación parcial. Hay una serie de bibliotecas que proporcionan eso, incluyendo underscore.js: http://documentcloud.github.com/underscore/
Lodash de partialRight
va a hacer lo que quiere, y aquí está la documentación:
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.
usted puede hacerlo con partial
from underscore.js, pasando _
como un marcador de posición, para ser llenado-in más tarde:
var square = _.partial(Math.pow, _, 2);
console.log(square(3)); // => 9
Esta característica apareció en febrero de 2014 (subrayar 1.6.0).
No había visto esta respuesta antes. Esta es en realidad la mejor solución. Gracias. – MaiaVictor
Vea también lodash 'partialRight()' solución en @ brian-m-hunt respuesta a continuación – Offirmo