Warum ist JavaScript bind() erforderlich?
Das problem in Beispiel 1 ist 'dies' unter Bezugnahme auf die globalen Namen statt der MeinName Objekt.
Verstehe ich die Verwendung von bind() in der Einstellung der Wert dieser auf ein bestimmtes Objekt, so löst es das problem in Beispiel 1, aber warum tritt dieses problem in Erster Linie? Ist es nur die Art, wie Javascript erstellt wurde?
Ich bin auch gefragt, warum Beispiel 3 löst das Problem und der Unterschied zwischen Beispiel 2 und 3.
JS:
this.name = "John"
var myName = {
name: "Tom",
getName: function() {
return this.name
}
}
var storeMyName = myName.getName; //example 1
var storeMyName2 = myName.getName.bind(myName); //example 2
var storeMyName3 = myName.getName(); //example 3
console.log("example 1: " + storeMyName()); //doesn't work
console.log("example 2: " + storeMyName2()); //works
console.log("example 3: " + storeMyName3); //works
- "Ist es nur die Art, wie Javascript erstellt wurde?" Ich denke, ja. Der Wert von
this
wird dynamisch ermittelt, es sei denn, es ist eine gebundene oder eine Pfeil-Funktion. Nicht sicher, was Sie sonst noch wissen möchten, erwarten lernen, wie manthis
funktioniert. - Mögliche Duplikate von Javascript-Aufruf() & apply() vs bind()?
- "Ich bin auch gefragt, warum Beispiel 3 löst das Problem"
storeMyName
undstoreMyName2
enthalten, die Funktionen in der Erwägung, dassstoreMyName3
enthält das Ergebnis des AufrufsmyName.getName()
. Großen Unterschied. Ich habe diesen Vergleich zwischen den Möglichkeiten der Aufruf einer Funktion und.bind
: twitter.com/fkling42/status/736228742008176640 . Vielleicht hilft es irgendwie. - medium.com/@dave_lunny/bind-for-dummies-5d1a750725b8#.liz1lnoo1
- Dies ist ein großer Lesen. Es hat sich geklärt alles über
this
im JS für mich: rainsoft.io/sanft-Erklärung-an-dieser-in-javascript
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Wert
this
ist bestimmt durch wie eine Funktion ist genannt. Wenn es Sie, der die Funktion aufruft, dann gibt es normalerweise keine Notwendigkeit für die Verwendung.bind
, da haben Sie die Kontrolle über wie Sie die Funktion aufrufen, und daher seinethis
Wert.Allerdings ist es oft nicht Sie, wer die Funktion aufruft. Funktionen übergeben werden, um andere Funktionen als callbacks und event-Handler. Sie sind aufgerufen, durch anderen - code und Sie haben keine Kontrolle über wie die Funktion aufgerufen wird, und deshalb nicht kontrollieren kann, was
this
verwiesen werden.Wenn Ihre Funktion erfordert
this
werden auf einen bestimmten Wert gesetzt und Sie sind nicht die, die die Funktion aufrufen, müssen Sie.bind
die Funktion zu einer bestimmtenthis
Wert.In anderen Worten:
.bind
können Sie den Wert desthis
ohne den Aufruf der Funktion jetzt.Hier ist der Vergleich mit Bezug auf/Aufruf von Funktionen:
Beispiel 1/2 und 3 könnten nicht unterschiedlicher sein.
storeMyName
undstoreMyName2
enthalten Funktionen, die aufgerufen werden, in der Zukunft, in der Erwägung, dassstoreMyName3
enthält das Ergebnis des AufrufsmyName.getName()
in diesem moment.Weiteren lesestoff:
myName.getName()
wird implizit gesetztthis
zumyName
. Es entsprichtmyName.getName.call(myName)
.Also, wenn Sie ausführen
var storeMyName = myName.getName;
der ersten Zeit, die es dauert, den globalenname
( dies.name = "John" )Wenn Sie
bind()
Funktion, es beginnt bezogen auf die definierten Namen in der aktuellen Schließung ( myName in diesem Fall ) und daher drucktTom
Dritten mal, seit dem die Funktion aufgerufen wird sofort der Anwendungsbereich der Verordnung ist es, innerhalb Ihrer eigenen lokalen Objekt-und damit druckt den Wert mit der Schließung
Tom
Binden ist der Mechanismus, die Sie ändern können, den Kontext(hier Ihr Standard-Kontext ist global) der Ausführung.
Basierend auf deinem Beispiel -
Zeile von oben ist, die Sie ausführen
storeMyName
Funktion im globalen Kontext, so dass für diese Ausführungthis.name
werden top-line(d.h. die globalen /die "John").Zur obigen Zeile, die Sie sind Explizit ändern der Kontext der Ausführung für
storeMyName2
Funktion(indem ich sagte, ich will nicht zum ausführen dieser Funktion als Globale Funktion möchte ich diese Funktion ausführen und im Kontext dermyName
Objekt, also in diesem Fallthis.name
wird "Tom")Und für diese oben genannte Zeile, die Sie gerade ausgeführten Funktion auf
myName
Objekt-Kontext noch wichtiger: Sie sind nicht die Ausführung derstoreMyName3
- und das ist, warum Ihr Kontext ist nicht global.Einer Analogie, die ich mag, die ich noch nie irgendwo gesehen:
Lassen Sie sagen, Sie haben ein foo-Objekt mit einer
bar
Funktion.Wenn Sie verbindlich sind die bar-Funktion einer anderen variable (oder indem er als eine Funktion der parameter, die häufiger Fall mit callbacks), Sie sind nicht verbindlich/übergeben der Funktion mit seinen einschließenden Objekts, sondern nur die "nude" - Funktion.
Also mit dem "nude" - Funktion
this
bedeutet das Globale Objekt.Einer kleinen demo
bound
nurfunction(){return this.foo;}