2012-03-20 15 views

risposta

6

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

Non avevo mai visto questa risposta prima. Questa è in realtà la soluzione migliore. Grazie. – MaiaVictor

+0

Vedere anche la soluzione di 'partialRight()' di lodash nella risposta di @ brian-m-hunt sotto – Offirmo

-1

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.

+1

Intendi solo con il fatto che sta chiedendo qualcos'altro? – gdoron

+0

Devo supporre, quindi, che sia un cattivo esempio, poiché questa risposta risolve molto chiaramente il problema nell'esempio fornito. –

+4

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

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

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

3

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

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

Problemi correlati