Wie kann ich in Javascript Argumente an eine Funktion binden, ohne den this
Parameter zu binden ?
Beispielsweise:
//Example function.
var c = function(a, b, c, callback) {};
//Bind values 1, 2, and 3 to a, b, and c, leave callback unbound.
var b = c.bind(null, 1, 2, 3); //How can I do this without binding scope?
Wie kann ich den Nebeneffekt vermeiden, dass der Funktionsumfang (z. B. Einstellung this
= Null) ebenfalls gebunden werden muss?
Bearbeiten:
Entschuldigung für die Verwirrung. Ich möchte Argumente binden, dann die gebundene Funktion später aufrufen und sie genau so verhalten lassen, als hätte ich die ursprüngliche Funktion aufgerufen und ihr die gebundenen Argumente übergeben:
var x = 'outside object';
var obj = {
x: 'inside object',
c: function(a, b, c, callback) {
console.log(this.x);
}
};
var b = obj.c.bind(null, 1, 2, 3);
//These should both have exact same output.
obj.c(1, 2, 3, function(){});
b(function(){});
//The following works, but I was hoping there was a better way:
var b = obj.c.bind(obj, 1, 2, 3); //Anyway to make it work without typing obj twice?
Ich bin noch neu in diesem Bereich, entschuldige die Verwirrung.
Vielen Dank!
javascript
Imbue
quelle
quelle
this
?var b = c.bind(this, 1,2,3);
bind()
sein zu habennull
? Scheint in FF gut zu funktionieren.this
in JavaScript nicht vollständig ungebunden sein. Es bedeutet immer etwas . Eine Bindungthis
an diethis
einschließende Funktion ist daher sehr sinnvoll.Antworten:
Sie können dies tun, aber am besten vermeiden Sie es, es als "bindend" zu betrachten, da dies der Begriff ist, der zum Festlegen des Werts "this" verwendet wird. Stellen Sie sich das vielleicht als "Umhüllung" der Argumente in eine Funktion vor?
Sie erstellen eine Funktion, in die die gewünschten Argumente über Closures integriert sind:
Hoffe, ich habe die Syntax genau dort. Es wird eine Funktion namens withWrappedArguments () erstellt (um pedantisch zu sein, es handelt sich um eine anonyme Funktion, die der Variablen zugewiesen ist), die Sie jederzeit und überall aufrufen können und immer mit actualArg1Value und actualArg2Value sowie mit allen anderen Elementen arbeiten, die Sie eingeben möchten Dort. Sie können auch weitere Argumente zum Zeitpunkt des Aufrufs akzeptieren lassen, wenn Sie möchten. Das Geheimnis sind die Klammern nach der letzten schließenden Klammer. Diese bewirken, dass die äußere Funktion mit den übergebenen Werten sofort ausgeführt wird und die innere Funktion generiert wird, die später aufgerufen werden kann. Die übergebenen Werte werden dann zum Zeitpunkt der Generierung der Funktion eingefroren.
Dies ist effektiv das, was bind tut, aber auf diese Weise ist es explizit, dass die umschlossenen Argumente einfach Verschlüsse für lokale Variablen sind, und es besteht keine Notwendigkeit, das Verhalten davon zu ändern.
quelle
f(x,y)
wir wollenf(x)(y)
oderg=f(x); g(y)
. Also wir ändern würdef=(x,y)=>x+y
zuf=(x)=>(y)=>x+y
.“In ES6 ist dies einfach mithilfe von Ruheparametern in Verbindung mit dem Spread-Operator möglich .
Wir können also eine Funktion definieren
bindArgs
, die wie folgt funktioniertbind
, außer dass nur Argumente gebunden sind, nicht aber der Kontext (this
).Dann für eine bestimmte Funktion
foo
und ein Objektobj
die Anweisungist äquivalent zu
Dabei werden nur das erste und das zweite Argument gebunden
bar
, während derobj
im Aufruf angegebene Kontext verwendet wird und zusätzliche Argumente nach den gebundenen Argumenten angehängt werden. Der Rückgabewert wird einfach weitergeleitet.quelle
let
undconst
waren zum Zeitpunkt meiner ersten Veröffentlichung noch nicht verfügbar. Es ist jetzt aktualisiert.Bei der nativen
bind
Methode geht derthis
Wert in der Ergebnisfunktion verloren. Sie können den allgemeinen Shim jedoch leicht neu codieren, um kein Argument für den Kontext zu verwenden:quelle
Function
aber es hat mir viel Zeit und einige hässliche Problemumgehungen gespart. Dankebind
. Sie können es leicht in einfunction bindArgs(fn){ …, args = slice.call(arguments, 1); …}
this
ista
. Sie könnenbind
natürlich stattdessen verwenden. Das OP kümmert sich jedoch ausdrücklich nicht um denthis
Wert und wollte eine ungebundene Teilfunktion.this
besteht, dass die Funktion verwendet wirdthis
, aber sie wollten sie in diesem Moment nicht binden. Auch das Bit in der Frage des OP//These should both have exact same output.
widerspricht anderen Teilen davon.bind
funktioniert überhaupt nicht mit Konstruktoren, die gebundenen Funktionen haben keine.prototype
. Nein,Function.prototype !== mymethod.prototype
Eine weitere winzige Implementierung nur zum Spaß:
Wie benutzt man:
quelle
quelle
const curry = (fn, ...curryArgs) => (...args) => fn(...curryArgs, args)
Es ist ein bisschen schwierig, genau zu sagen, was Sie letztendlich tun möchten, da das Beispiel willkürlich ist, aber Sie möchten vielleicht Partials (oder Currying) untersuchen: http://jsbin.com/ifoqoj/1/edit
Link zu John Resigs Artikel: http://ejohn.org/blog/partial-functions-in-javascript/
quelle
partial
mitundefined
Argumenten aufgerufen werden, um zu funktionieren - nicht das, was man erwarten würde, und bei Funktionen, die eine beliebige Anzahl von Parametern annehmen, fehlerhaft sein.this
Objekt wird immer noch durcheinander gebracht. WerfenVielleicht möchten Sie den Verweis darauf in Ihrem vorletzten Code binden : -
Bereits angewendete Bindung zum Beispiel dies und später können Sie es nicht ändern. Was ich vorschlagen werde, verwenden Sie die Referenz auch als Parameter wie folgt: -
quelle
Verwenden Sie ein
protagonist
!Grundsätzlich wird die Funktion, an die Sie Parameter übergeben möchten, zu einem Proxy, den Sie aufrufen können, um eine Variable zu übergeben, und sie gibt die Funktion zurück, die Sie tatsächlich ausführen möchten.
Hoffe das hilft!
quelle
Ein anonymer Benutzer hat diese zusätzlichen Informationen gepostet:
quelle
Nun, für das Beispiel, das Sie gegeben haben, wird dies ausreichen
Wenn Sie die Parameter garantieren möchten:
Aber wenn ja, sollten Sie sich einfach an Ihre Lösung halten:
Es ist der bessere Weg.
quelle
So einfach ist das?
Allgemeinere Lösung:
quelle
Mit LoDash können Sie die
_.partial
Funktion nutzen.quelle
Warum nicht einen Wrapper um die Funktion verwenden, um diese als Mythos zu speichern?
quelle
jQuery 1.9 brachte genau diese Funktion mit der Proxy-Funktion.
Beispiel:
quelle
Jquery Anwendungsfall:
stattdessen:
benutze das:
quelle