Ich weiß das schon apply
und call
sind ähnliche Funktionen, die setzen this
(Kontext einer Funktion).
Der Unterschied liegt in der Art und Weise, wie wir die Argumente senden (manuell gegen Array).
Frage:
Aber wann sollte ich die bind()
Methode anwenden?
var obj = {
x: 81,
getX: function() {
return this.x;
}
};
alert(obj.getX.bind(obj)());
alert(obj.getX.call(obj));
alert(obj.getX.apply(obj));
javascript
arrays
function
Royi Namir
quelle
quelle
call()
Sie jedoch Argumente einzeln undapply()
als Argumentarray. Weitere Informationen finden Sie in der verknüpften Dokumentation, die Ihre Frage vollständig beantworten sollte.kind of weird there is not an existing question about this :
In Bezug auf das. Dies liegt wahrscheinlich daran, dassbind()
die beiden anderen bereits in JavaScript 1.8.5 - ECMA-262, 5. Ausgabe, vorhanden waren. Währendcall()
undapply()
gibt es seit JavaScript 1.3 - ECMA-262 3rd Edition. SO hat Fragen über sie wie: Was-ist-der-Differenz-zwischen-Call-and-Anwendung . Ich rate nur, als ich mich das selbst fragte.Antworten:
Ich habe diesen Vergleich zwischen Funktionsobjekten, Funktionsaufrufen
call/apply
und vorbind
einiger Zeit erstellt:.bind
Mit dieser Option können Sie denthis
Wert jetzt festlegen und die Funktion in Zukunft ausführen , da ein neues Funktionsobjekt zurückgegeben wird.quelle
Verwenden
.bind()
Sie diese Option, wenn diese Funktion später in einem bestimmten Kontext aufgerufen werden soll, der bei Ereignissen hilfreich ist. Verwenden Sie.call()
oder,.apply()
wenn Sie die Funktion sofort aufrufen und den Kontext ändern möchten.Call / Apply ruft die Funktion sofort auf, während
bind
eine Funktion zurückgegeben wird, bei deren späterer Ausführung der richtige Kontext für den Aufruf der ursprünglichen Funktion festgelegt wird. Auf diese Weise können Sie den Kontext in asynchronen Rückrufen und Ereignissen beibehalten.Ich mache das oft:
Ich verwende es ausgiebig in Node.js für asynchrone Rückrufe, für die ich eine Mitgliedsmethode übergeben möchte, möchte aber dennoch, dass der Kontext die Instanz ist, die die asynchrone Aktion gestartet hat.
Eine einfache, naive Implementierung von bind wäre wie folgt:
Es steckt mehr dahinter (wie das Übergeben anderer Argumente), aber Sie können mehr darüber lesen und die tatsächliche Implementierung auf dem MDN sehen .
Hoffe das hilft.
quelle
bind
kehrt zurück.Sie alle fügen dies der Funktion (oder dem Objekt) hinzu, und der Unterschied besteht im Funktionsaufruf (siehe unten).
call fügt dies in die Funktion ein und führt die Funktion sofort aus:
bind fügt dies in die Funktion ein und muss separat wie folgt aufgerufen werden:
oder so:
apply ähnelt dem Aufruf, mit der Ausnahme, dass ein Array-ähnliches Objekt verwendet wird, anstatt die Argumente einzeln aufzulisten:
quelle
"use strict"
, um zu vermeiden, dass solche reservierten Schlüsselwörter überschrieben werden. +1.Beispiele für Anwenden vs. Anrufen vs. Binden
Anruf
Anwenden
Binden
Wann jeweils zu verwenden
Anruf und Bewerbung sind ziemlich austauschbar. Entscheiden Sie einfach, ob es einfacher ist, ein Array oder eine durch Kommas getrennte Liste von Argumenten einzusenden.
Ich erinnere mich immer daran, welches welches ist, indem ich mich daran erinnere, dass Call für Komma (getrennte Liste) und Apply für Array steht.
Binden ist ein bisschen anders. Es gibt eine neue Funktion zurück. Call and Apply führt die aktuelle Funktion sofort aus.
Binden ist für viele Dinge großartig. Wir können es verwenden, um Funktionen wie im obigen Beispiel zu curry. Wir können eine einfache Hallo-Funktion übernehmen und daraus ein Hallo-Hallo oder Hallo-Kelly machen. Wir können es auch für Ereignisse wie onClick verwenden, bei denen wir nicht wissen, wann sie ausgelöst werden, aber wir wissen, welchen Kontext sie haben sollen.
Referenz: codeplanet.io
quelle
call
undapply
, folgt daraus, dass Siethis
das erste Argument als zuweisen würden , wenn Sie kein innerhalb der Methode habennull
?var person1 = {firstName: 'Jon', lastName: 'Kuperman'}; function say(greeting) { console.log(greeting + ' ' + this.firstName + ' ' + this.lastName); } say.apply(person1, ['Hello']); // Hello Jon Kuperman
Funktioniert einwandfrei und gibt VM128: 4 aus Hallo HalloHiermit können Sie den Wert
this
unabhängig davon festlegen, wie die Funktion aufgerufen wird. Dies ist sehr nützlich, wenn Sie mit Rückrufen arbeiten:Das gleiche Ergebnis mit zu erzielen,
call
würde folgendermaßen aussehen:quelle
.bind()
wie zuvor gezeigt ist falsch. Wenn Sie einefn.bind(obj)
andere Funktion verwenden, wird diese zurückgegeben (nicht die, die Sie zuvor erstellt haben). Und es gibt keine Fähigkeit, den Wert desthis
Inneren derbinded
Funktion zu ändern . Meist wird dies für Rückrufversicherungen verwendetthis
. Aber in Ihrem Beispiel gibt es keine Unterschiede im Ergebnis. Aberfn !== fn.bind(obj);
Beachten Sie, dass.Angenommen, wir haben
multiplication
FunktionErstellen wir einige Standardfunktionen mit
bind
var multiby2 = multiplication.bind(this,2);
Jetzt ist multiby2 (b) gleich Multiplikation (2, b);
Was ist, wenn ich beide Parameter in bind übergebe?
Jetzt ist getSixAlways () gleich Multiplikation (3,2);
gerade übergebender Parameter gibt 6 zurück;
getSixAlways(12); //6
Dadurch wird eine neue Multiplikationsfunktion erstellt und der magicMultiplication zugewiesen.
Oh nein, wir verstecken die Multiplikationsfunktionalität in magicMultiplication.
Aufruf
magicMultiplication
gibt ein Leerzeichen zurückfunction b()
bei der Ausführung funktioniert es gut
magicMultiplication(6,5); //30
Wie wäre es mit einem Anruf und einer Bewerbung?
magicMultiplication.call(this,3,2); //6
magicMultiplication.apply(this,[5,2]); //10
Mit einfachen Worten,
bind
erstellt die Funktioncall
undapply
führt die Funktion aus, währendapply
die Parameter im Array erwartet werdenquelle
bind
erstellt die Funktioncall
undapply
führt die Funktion aus, währendapply
die Parameter im Array erwartet werden"Beide
Function.prototype.call()
undFunction.prototype.apply()
rufen eine Funktion mit einem bestimmtenthis
Wert auf und geben den Rückgabewert dieser Funktion zurück.Function.prototype.bind()
Auf der anderen Seite wird eine neue Funktion mit einem bestimmtenthis
Wert erstellt und diese Funktion zurückgegeben, ohne sie auszuführen.Nehmen wir also eine Funktion, die so aussieht:
Nehmen wir nun ein Objekt, das so aussieht:
Wir können unsere Funktion folgendermaßen an unser Objekt binden:
Jetzt können wir
Obj.log
überall in unserem Code ausführen:Was wirklich interessant wird, ist, wenn Sie nicht nur einen Wert für
this
, sondern auch für sein Argument bindenprop
:Wir können dies jetzt tun:
quelle
bind : Es bindet die Funktion mit dem angegebenen Wert und Kontext, führt die Funktion jedoch nicht aus. Um die Funktion auszuführen, müssen Sie die Funktion aufrufen.
call : Führt die Funktion mit dem angegebenen Kontext und Parameter aus.
apply : Führt die Funktion mit dem angegebenen Kontext und Parameter als Array aus .
quelle
Hier ist ein guter Artikel , den Unterschied zwischen zu veranschaulichen
bind()
,apply()
undcall()
fasst es als unten.bind()
ermöglicht es uns , auf die spezifische Aufgabe wird es sein, gebunden leicht einstellen dies , wenn eine Funktion oder Methode aufgerufen wird.bind()
Erlauben Sie uns, Methoden auszuleihenEin Problem bei diesem Beispiel besteht darin, dass wir
showData
demcars
Objekt eine neue Methode hinzufügen und dies möglicherweise nicht nur zum Ausleihen einer Methode tun möchten, da das Auto-Objekt möglicherweise bereits einen Eigenschafts- oder Methodennamen hatshowData
. Wir wollen es nicht versehentlich überschreiben. Wie wir in unserer Diskussion vonApply
undCall
unten sehen werden, ist es am besten, eine Methode entweder mit der MethodeApply
oder auszuleihenCall
.bind()
Erlauben Sie uns, eine Funktion zu curryFunction Currying , auch als Teilfunktionsanwendung bezeichnet , ist die Verwendung einer Funktion (die ein oder mehrere Argumente akzeptiert), die eine neue Funktion mit einigen der bereits festgelegten Argumente zurückgibt.
Wir können
bind()
diesegreet
Funktion verwenden, um sie zu curryapply()
odercall()
um diesen Wert einzustellenDas
apply
,call
undbind
Methoden werden verwendet , die diesen Wert einzustellen , wenn eine Methode aufgerufen, und sie tun es auf leicht unterschiedliche Weise Gebrauch direkte Kontrolle und Flexibilität in unserem JavaScript - Code zu ermöglichen.Die Methoden
apply
undcall
sind beim Festlegen dieses Werts nahezu identisch, außer dass Sie die Funktionsparameterapply ()
als Array übergeben , während Sie die Parameter einzeln auflisten müssen, um sie an diecall ()
Methode zu übergeben.Hier ist ein Beispiel, um dies in der Rückruffunktion zu verwenden
call
oderapply
einzustellen .Funktionen mit
apply
oder ausleihencall
Array-Methoden ausleihen
Lassen Sie uns ein
array-like
Objekt erstellen und einige Array-Methoden ausleihen, um unser Array-ähnliches Objekt zu bearbeiten.Ein weiterer häufiger Fall ist die folgende Konvertierung
arguments
in ein ArrayAndere Methoden ausleihen
Verwenden Sie
apply()
diese Option, um eine Funktion mit variabler Arität auszuführenDas
Math.max
ist ein Beispiel mit variabler arity Funktion,Aber was ist, wenn wir eine Reihe von Zahlen haben, an die wir übergeben können
Math.max
? Wir können das nicht machen:Hier
apply ()
hilft uns die Methode, verschiedene Funktionen auszuführen . Anstelle des oben genannten müssen wir das Zahlenfeld mitapply (
) wie folgt übergeben:quelle
call / apply führt die Funktion sofort aus:
bind führt die Funktion nicht sofort aus, sondern gibt die verpackte Apply- Funktion zurück (für die spätere Ausführung):
quelle
Syntax
Hier
quelle
Der grundlegende Unterschied zwischen Aufrufen, Übernehmen und Binden ist:
Bind wird verwendet, wenn Ihr Ausführungskontext später im Bild angezeigt werden soll.
Ex:
Angenommen, ich möchte diese Methode in einer anderen Variablen verwenden
Um die Referenz des Autos in einer anderen Variablen zu verwenden, sollten Sie verwenden
Lassen Sie uns über eine umfassendere Verwendung der Bindefunktion sprechen
Warum? Da func jetzt mit Nummer 1 gebunden ist, zeigt es auf Global Object, wenn wir in diesem Fall keine Bindung verwenden.
Call, Apply werden verwendet, wenn Sie die Anweisung gleichzeitig ausführen möchten.
quelle
Anruf anwenden und binden. und wie unterschiedlich sie sind.
Lernen wir das Anrufen und Anwenden unter Verwendung einer beliebigen täglichen Terminologie.
Sie haben drei Autos,
your_scooter , your_car and your_jet
die mit dem gleichen Mechanismus (Methode) beginnen. Wir haben ein Objektautomobile
mit einer Methode erstelltpush_button_engineStart
.Lassen Sie uns verstehen, wann Anruf und Anwendung verwendet wird. Lets nehme an, dass Sie ein Ingenieur, und Sie haben
your_scooter
,your_car
undyour_jet
die mit einem push_button_engine_start nicht gekommen , und Sie wünschen , einen Dritten zu verwendenpush_button_engineStart
.Wenn Sie die folgenden Codezeilen ausführen, wird ein Fehler ausgegeben. WARUM?
Das obige Beispiel gibt Ihrem_scooter, your_car, your_jet erfolgreich eine Funktion aus einem Automobilobjekt.
Lassen Sie uns tiefer eintauchen. Hier werden wir die obige Codezeile aufteilen.
automobile.push_button_engineStart
hilft uns, die angewandte Methode zu finden.Weiterhin verwenden wir Apply oder Call mit der Punktnotation.
automobile.push_button_engineStart.apply()
Wenden Sie nun zwei Parameter an und rufen Sie an.
Hier setzen wir den Kontext in die letzte Codezeile.
automobile.push_button_engineStart.apply(your_scooter,[20])
Der Unterschied zwischen call und apply besteht nur darin, dass apply Parameter in Form eines Arrays akzeptiert, während call einfach eine durch Kommas getrennte Liste von Argumenten akzeptieren kann.
Was ist die JS-Bindungsfunktion?
Eine Bindefunktion bindet im Grunde den Kontext von etwas und speichert es dann in einer Variablen zur späteren Ausführung.
Lassen Sie uns unser vorheriges Beispiel noch besser machen. Früher haben wir eine Methode verwendet, die zum Automobilobjekt gehört, und sie zur Ausrüstung verwendet
your_car, your_jet and your_scooter
. Stellen wir uns nun vor, wir möchten ein separatespush_button_engineStart
separates System erstellen, um unsere Autos zu einem späteren Zeitpunkt der gewünschten Ausführung einzeln zu starten.immer noch nicht zufrieden?
Lassen Sie es uns als Träne klar machen. Zeit zum Experimentieren. Wir werden zurückkehren, um die Funktionsanwendung aufzurufen und anzuwenden, und versuchen, den Wert der Funktion als Referenz zu speichern.
Das folgende Experiment schlägt fehl, da Aufruf und Anwenden sofort aufgerufen werden. Daher gelangen wir nie zum Stadium des Speicherns einer Referenz in einer Variablen, in der die Bindungsfunktion die Show stiehlt
var test_function = automobile.push_button_engineStart.apply(your_scooter);
quelle
Aufruf: Aufruf ruft die Funktion auf und ermöglicht es Ihnen, Argumente einzeln zu übergeben
Anwenden: Anwenden ruft die Funktion auf und ermöglicht es Ihnen, Argumente als Array zu übergeben
Bind: Bind gibt eine neue Funktion zurück, mit der Sie dieses Array und eine beliebige Anzahl von Argumenten übergeben können.
quelle
call (): - Hier übergeben wir die Funktionsargumente einzeln, nicht in einem Array-Format
apply (): - Hier übergeben wir die Funktionsargumente in einem Array-Format
binden() :--
quelle
JavaScript-Aufruf ()
JavaScript anwenden ()
** Aufruf- und Apply-Funktion sind Differenzaufruf-Take-Separate-Argumente, aber Apply-Take-Array wie folgt: [1,2,3] **
JavaScript bind ()
quelle
Stellen Sie sich vor, Binden ist nicht verfügbar. Sie können es einfach wie folgt konstruieren:
quelle
quelle
Das Hauptkonzept hinter all diesen Methoden ist das Funktionsgraben .
Durch das Ausleihen von Funktionen können wir die Methoden eines Objekts für ein anderes Objekt verwenden, ohne eine Kopie dieser Methode erstellen und an zwei verschiedenen Stellen verwalten zu müssen. Es wird durch die Verwendung von erreicht. Anruf() , . apply () oder. bind (), die alle vorhanden sind, um dies explizit für die von uns ausgeliehene Methode festzulegen
Unten finden Sie ein Beispiel für all diese Methoden
ANRUF
ANWENDEN
BINDEN
printMyNAme () ist die Funktion, die die Funktion aufruft
Unten ist der Link für jsfiddle
https://codepen.io/Arham11/pen/vYNqExp
quelle
Ich denke, die gleichen Stellen von ihnen sind: Alle von ihnen können diesen Wert einer Funktion ändern. Die Unterschiede von ihnen sind: Die Bindungsfunktion gibt als Ergebnis eine neue Funktion zurück; Die Methoden call und apply führen die Funktion sofort aus, apply kann jedoch ein Array als Parameter akzeptieren und das Array getrennt analysieren. Außerdem kann die Bindungsfunktion Currying sein.
quelle
Die Bindungsfunktion sollte verwendet werden, wenn wir eine Funktion mit einem bestimmten Kontext zuweisen möchten, z.
Wenn wir im obigen Beispiel die Funktion demo.setValue () aufrufen und die Funktion this.getValue direkt übergeben, wird die Funktion demo.setValue nicht direkt aufgerufen, da dies in setTimeout auf das Fensterobjekt verweist, sodass wir den Kontext des Demoobjekts an this.getValue übergeben müssen Funktion mit bind. Dies bedeutet, dass wir die Funktion nur im Kontext des Demo-Objekts übergeben und nicht die Funktion tatsächlich aufrufen.
Ich hoffe, du verstehst .
Weitere Informationen finden Sie in der Javascript-Bindungsfunktion, die Sie im Detail kennen
quelle