2012-03-20 17 views

Odpowiedz

6

Szukasz częściowych funkcji, które są wygodnym skrótem dla aliasów.

„Klasyczny” sposób, aby robić to, co pytasz o to ze:

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

Korzystanie z funkcji częściowych byłoby:

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

Niestety Function.prototype.partial nie jest w jakikolwiek przeglądarka.


Na szczęście dla ciebie, pracuję w bibliotece, co uważam za olejki JavaScript obiektowych funkcje, metody, klasy itp Jest 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

Nie widziałem tej odpowiedzi wcześniej. To jest rzeczywiście najlepsze rozwiązanie. Dzięki. – MaiaVictor

+0

Zobacz także rozwiązanie "partialRight()" w odpowiedzi @ brian-m-hunt poniżej – Offirmo

-1

Co w tym złego:

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

Aby odpowiedzieć na pytanie poprawnie, należy utworzyć anonimową funkcję, która wywołuje funkcję „związany” z zestawu parametrów, takich jak:

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

W ten sposób można powiązać dowolną liczbę parametrów, zmienić parametry lub kombinację tych dwóch parametrów. Należy jednak pamiętać, że ma to pewien wpływ na wydajność, ponieważ dodajesz dodatkowe wywołanie funkcji do stosu za każdym razem, gdy zwiążesz się w ten sposób.

+1

Masz na myśli, z wyjątkiem tego, że prosi o coś innego? – gdoron

+0

Muszę więc założyć, że jest to zły przykład, ponieważ ta odpowiedź bardzo wyraźnie rozwiązuje problem w podanym przykładzie. –

+4

Podany przykład nie był do rozwiązania, był to tylko przykład, abyś mógł zrozumieć, czego potrzebuję. Przepraszam, ale to się nie uda, mimo że intencja jest dobra. – 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

Właściwie oczekiwałem implementacji przy użyciu standardowej biblioteki lub popularnej biblioteki. Wygląda jednak na to, że tak nie jest, więc jest to właściwa odpowiedź. Dziękuję Ci. – MaiaVictor

3

Lodash na partialRight będą robić to, co chcesz, i tutaj jest dokumentacja:

 
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

można zrobić z partial from underscore.js, przekazując _ jako zastępczy, aby być wypełnione później:

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

Funkcja ta pojawiła się w lutym 2014 (podkreślenia 1.6.0).

Powiązane problemy