2012-03-20 13 views

Respuesta

6

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); 
      }; 
     }; 
    } 
}()); 
+0

No había visto esta respuesta antes. Esta es en realidad la mejor solución. Gracias. – MaiaVictor

+0

Vea también lodash 'partialRight()' solución en @ brian-m-hunt respuesta a continuación – Offirmo

-1

¿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í.

+1

¿Quiere decir excepto que él está pidiendo algo más? – gdoron

+0

Voy a tener que asumir, entonces, que es un mal ejemplo, ya que esta respuesta resuelve el problema muy claramente en el ejemplo dado. –

+4

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

11
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 
+0

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

3

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. 
0

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).

Cuestiones relacionadas