Jak mogę powiązać z prawej strony funkcji? Przykład:Javascript: powiązanie z prawej strony funkcji?
var square = Math.pow.bindRight(2);
console.log(square(3)); //desired output: 9
Jak mogę powiązać z prawej strony funkcji? Przykład:Javascript: powiązanie z prawej strony funkcji?
var square = Math.pow.bindRight(2);
console.log(square(3)); //desired output: 9
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);
};
};
}
}());
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.
Masz na myśli, z wyjątkiem tego, że prosi o coś innego? – gdoron
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. –
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
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
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
Wygląda na to, że chcesz zastosować częściową aplikację. Istnieje wiele bibliotek, które to zapewniają, w tym underscore.js: http://documentcloud.github.com/underscore/
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.
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).
Nie widziałem tej odpowiedzi wcześniej. To jest rzeczywiście najlepsze rozwiązanie. Dzięki. – MaiaVictor
Zobacz także rozwiązanie "partialRight()" w odpowiedzi @ brian-m-hunt poniżej – Offirmo