Um das große Bild zu liefern, werde ich erklären, beide, dynamische und lexikalische Bindung.
Dynamic Name Bindung
this
bezieht sich auf das Objekt die Methode aufgerufen wird. Dies ist ein regelmäßig zu lesender Satz zu SO. Aber es ist immer noch nur eine Phrase, ziemlich abstrakt. Gibt es zu diesem Satz ein entsprechendes Codemuster?
Ja, es gibt:
const o = {
m() { console.log(this) }
}
// the important patterns: applying methods
o.m(); // logs o
o["m"](); // logs o
m
ist ein Verfahren, weil es auf this
beruht. o.m()
oder o["m"]()
bedeutet, dass m
auf o
angewendet wird. Diese Muster sind die Javascript-Übersetzung zu unserem berühmten Satz.
Es ist ein weiteres wichtiges Codemuster, die Sie achten sollen:
"use strict";
const o = {
m() { console.log(this) }
}
// m is passed to f as a callback
function f(m) { m() }
// another important pattern: passing methods
f(o.m); // logs undefined
f(o["m"]); // logs undefined
Es ist sehr ähnlich zu dem vorherigen Muster, nur die Klammer fehlen. Aber die Konsequenzen sind beträchtlich: Wenn Sie m
an die Funktion f
übergeben, ziehen Sie m
von seinem Objekt/Kontext o
heraus. Es wird jetzt entwurzelt und this
bezieht sich auf nichts (strikter Modus vorausgesetzt).
Lexical (oder Static) Name Binding
Pfeil Funktionen haben keine eigene this
/super
/arguments
Bindung. Sie erben sie von ihren Eltern lexikalischen Gültigkeitsbereich:
const toString = Object.prototype.toString;
const o = {
foo:() => console.log("window", toString.call(this)),
bar() {
const baz =() => console.log("o", toString.call(this));
baz();
}
}
o.foo() // logs window [object Window]
o.bar() // logs o [object Object]
Neben dem globalen Bereich (Window
in Browsern) nur Funktionen sind in der Lage einen Bereich in Javascript (und {}
Blöcken in ES2015) zu bilden.Wenn die Pfeilfunktion aufgerufen wird, gibt es keine Umgebungsfunktion, von der baz
seine this
erben könnte. Folglich erfasst es die this
Bindung des globalen Bereichs, der an das Window
Objekt gebunden ist.
Wenn baz
von o.bar
aufgerufen wird, wird der Pfeil Funktion durch o.bar
umgeben (o.bar
bildet die Mutterlexikalischen Gültigkeitsbereich) und kann erben o.bar
‚s this
binden. o.bar
wurde unter o
aufgerufen und somit ist dessen this
an o
gebunden.
Es fängt einfach den Wert von 'this' aus dem enthaltenden Bereich, behandle es wie jedes o ther variable. – Barmar
Es ist nur so, dass Sie nicht den Klotz von 'var self = this;' machen müssen und dann 'self' in der Funktion verwenden. – Barmar
In Ihrem Fall gibt es keinen umschließenden Kontext, oder es ist der globale Kontext oder der Modulkontext, also ist "das" was auch immer es in diesem Fall ist, höchstwahrscheinlich Null oder Fenster. Um es anders auszudrücken, 'this' hat genau den gleichen Wert wie wenn Sie vor der Funktionszuweisung ein' console.log (this) 'hinzugefügt hätten. –