Dieses Schlüsselwort ist einer der komplexesten Mechanismen in JavaScript. Es handelt sich um ein ganz besonderes Schlüsselwort, das im Umfang aller Funktionen automatisch definiert wird. Doch selbst sehr erfahrenen JavaScript-Entwicklern fällt es schwer zu sagen, worauf genau es verweist.
Was ist das?
Auf die Funktion selbst verweisen?
Allein aufgrund der wörtlichen Bedeutung könnte man leicht annehmen, dass dies auf die Funktion selbst hinweist. Wir können uns ein Beispiel ansehen.
function foo() {
this.count = this.count ? this.count + 1 : 1;
}
for (let i = 0; i < 5; i++) {
foo();
}
console.log(foo.count); // undefined
Nach dem Login kopieren
Sie können sehen, dass die Ausgabe von foo.count nicht die erwartete 5 ist, sondern die zu Beginn zugewiesene 0. Mit anderen Worten: 5,而是一开始赋值的0。也就是说this其实并没有指向函数本身。
指向作用域?
还有一种比较常见的误解是,this指向了函数的作用域。
function foo() {
var a = 2;
bar();
}
function bar() {
console.log(this.a);
}
foo(); // undefined
最后要介绍的是使用newDies deutet nicht wirklich auf die Funktion selbst hin .
Punkt auf Umfang? Ein weiteres häufiges Missverständnis ist, dass dies auf den Umfang der Funktion hinweist.
function Foo(a) {
this.a = a;
}
var bar = new Foo(2);
bar.a; // 2
Nach dem Login kopieren
In diesem Code wird bar in foo ausgeführt und die Ausgabe von this.a ist undefiniert. Mit anderen Worten:
Dies weist nicht auf den Umfang der Funktion hin.
Es ist nicht dies, es ist nicht das, was ist das? Während der Ausführung der Funktion wird ein Ausführungskontext (ein Datensatz) erstellt. Dies ist ein Attribut in diesem Kontext und wird während der Ausführung verwendet. Der Sinn davon hängt davon ab, wo die Funktion aufgerufen wird. Diese BindungsregelnDiese Bindung hat vier Regeln, die befolgt werden können, die im Folgenden einzeln vorgestellt werden. 1. Standardbindung
Implizite Bindung bedeutet, ob im Besitz eines Objekts ist oder von diesem eingeschlossen wird, wenn die Funktion ausgeführt wird. Mit anderen Worten, wenn die Funktion ausgeführt wird, ist nicht ganz klar, ob sie als Attribut eines Objekts ausgeführt wird. Hier ist ein Beispiel: 🎜rrreee🎜Im Beispiel wird foo zu diesem Zeitpunkt als Attribut ausgeführt , obj dient als Kontext der Funktion und zeigt auf obj. this.a ist äquivalent zu obj.a. Beim Aufruf der Objekteigenschaftskette wirkt sich nur die letzte Ebene auf die aufrufende Position aus, was bedeutet, dass die letzte Ebene den This-Zeiger beeinflusst. 🎜🎜Viele Front-End-Freunde haben diese Frage möglicherweise in Interviews gesehen: 🎜rrreee🎜Dies ist das häufigste Problem bei der impliziten Bindung. 🎜Impliziter Verlust: Implizit gebundene Funktionen verlieren das gebundene Objekt 🎜. Obwohl „bar“ ein Verweis auf obj.foo ist, bezieht es sich tatsächlich auf die Funktion „bar“ und ist ein Aufruf einer unabhängigen Funktion /code> . 🎜🎜Es gibt auch dieses Zeigeproblem einer klassischen Callback-Funktion, das ebenfalls implizit verloren geht. 🎜rrreee🎜Zusammenfassung: Bei der impliziten Bindung muss beim Zuweisen von Werten (Rückrufe sind implizite Zuweisungen) besonderes Augenmerk auf das Problem des impliziten Verlusts gelegt werden. 🎜🎜3. Anzeigebindung🎜🎜Funktion in JavaScript bietet zwei Methoden call und apply. Der erste übergebene Parameter ist ein Objekt, das an dieses Objekt gebunden wird. Wenn ein primitiver Wert (String, Zahl, Boolean) übergeben wird, wird er in seine Objektform (new String(), new Boolean(), new Number()) konvertiert. 🎜rrreee🎜Obwohl wir call und apply verwenden können, um den Sinn davon explizit anzugeben, besteht immer noch das Problem, dass die Bindung verloren geht. Es kann durch die sogenannte harte Bindung (Bind-Funktion) gelöst werden, daher werde ich hier nicht auf Details eingehen. 🎜🎜4. Neu🎜🎜Das Letzte, was ich vorstellen möchte, ist die Verwendung von neu, um die Bindung von neu in js und neu in zu ändern andere Sprachen völlig anders. 🎜Neuer Ausführungsprozess: 🎜🎜🎜 Erstellen Sie ein leeres Objekt. 🎜🎜 Führen Sie das Andocken des Prototyps am aktuellen leeren Objekt durch. 🎜🎜 Geben Sie das Ergebnis der Funktionsausführung oder das aktuelle leere Objekt zurück. 🎜🎜rrreee🎜 Wenn Sie new zum Aufrufen einer Funktion verwenden, erstellen wir eine neues Objekt und binden Sie es im Funktionsaufruf daran. 🎜🎜Priorität🎜🎜Lassen Sie uns abschließend kurz über die Prioritätsbeziehung sprechen: neue > implizite Bindung > 🎜🎜Empfohlenes Lernen: „🎜🎜JavaScript-Grundlagen-Tutorial🎜🎜“🎜🎜🎜
Das obige ist der detaillierte Inhalt vonWas ist das Magische daran in JavaScript?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn