Heim > Artikel > Web-Frontend > Tipps, Arbeitsprinzipien und Vorsichtsmaßnahmen für die Verwendung dieses Schlüsselworts in JavaScript_Javascript-Tipps
Um dies je nach Standort zu verstehen, kann die Situation grob in drei Typen unterteilt werden:
1. In Funktionen: Dies ist normalerweise ein impliziter Parameter.
2. Außerhalb der Funktion (im Top-Level-Bereich): Im Browser bezieht sich dies auf das globale Objekt in Node.js, es bezieht sich auf die Exporte des Moduls.
3. Die an eval() übergebene Zeichenfolge: Wenn eval() direkt aufgerufen wird, bezieht sich dies auf das aktuelle Objekt; wenn eval() indirekt aufgerufen wird, bezieht sich dies auf das globale Objekt.
Für diese Kategorien haben wir entsprechende Tests durchgeführt:
1. Dies in der Funktion
Funktionen können grundsätzlich alle aufrufbaren Strukturen in JS darstellen, daher ist dies das häufigste Szenario für die Verwendung, und Funktionen können in die folgenden drei Rollen unterteilt werden:
Echte Funktion
Konstruktor
Methode
1.1 dies
in realen FunktionenIn realen Funktionen ist der Wert davon ein Muster, das vom Kontext abhängt, in dem es gefunden wird.
Sloppy-Modus: Dies bezieht sich auf das globale Objekt (Fenster im Browser).
Strikter Modus: Der Wert ist undefiniert.
Dies ist ein impliziter Parameter der Funktion, daher ist sein Wert immer derselbe. Sie können den Wert jedoch explizit definieren, indem Sie die Methoden call() oder apply() verwenden.
1.2 this
im KonstruktorSie können new verwenden, um eine Funktion als Konstruktor zu verwenden. Die neue Operation erstellt ein neues Objekt und übergibt dieses Objekt über diesen an den Konstruktor.
Das Implementierungsprinzip neuer Operationen in JS ist ungefähr wie im folgenden Code dargestellt (eine genauere Implementierung finden Sie hier, diese Implementierung ist auch komplizierter):
1.3 dies
in der MethodeDie Verwendung davon in Methoden ähnelt eher traditionellen objektorientierten Sprachen: Der Empfänger, auf den hiermit verwiesen wird, ist das Objekt, das diese Methode enthält.
2. Dies im Umfang
Im Browser ist der Bereich der globale Bereich, und dieser bezieht sich auf das globale Objekt (genau wie Fenster):
In Node.js führen Sie Funktionen normalerweise in Modulen aus. Daher ist der Top-Level-Bereich ein ganz besonderer Modulbereich:
3. dies in eval()
eval() kann direkt (durch Aufruf des Funktionsnamens „eval“) oder indirekt (auf andere Weise aufgerufen, z. B. call()) aufgerufen werden. Weitere Einzelheiten finden Sie hier.
4. Fallen im Zusammenhang damit
Sie sollten sich vor den drei damit verbundenen Fallen in Acht nehmen, die im Folgenden vorgestellt werden. Es ist zu beachten, dass in den folgenden Beispielen die Verwendung des strengen Modus die Sicherheit des Codes verbessern kann. Da dieser Wert in realen Funktionen undefiniert ist, erhalten Sie eine Warnung, wenn etwas schief geht.
4.1 Ich habe vergessen, „Neu“ zu verwenden
Wenn Sie zum Aufrufen des Konstruktors nicht new verwenden, verwenden Sie tatsächlich eine echte Funktion. Daher wird dies nicht der von Ihnen erwartete Wert sein. Im Sloppy-Modus zeigt dies auf das Fenster und Sie erstellen globale Variablen:
Wenn Sie jedoch den strikten Modus verwenden, erhalten Sie weiterhin eine Warnung (dies===undefiniert):
4.2 Unsachgemäßer Einsatz von Methoden
Wenn Sie den Wert einer Methode direkt abrufen (nicht aufrufen), verwenden Sie die Methode als Funktion. Sie werden dies wahrscheinlich tun, wenn Sie eine Methode als Parameter an eine Funktion oder eine aufrufende Methode übergeben möchten. Dies ist bei setTimeout() und registrierten Event-Handlern der Fall. Ich werde die Methode callIt() verwenden, um dieses Szenario zu simulieren:
Wenn Sie eine Methode im Sloppy-Modus als Funktion aufrufen, zeigt *this* auf das globale Objekt, sodass alle nachfolgenden Erstellungen globale Variablen sind.
Wenn Sie dies im strengen Modus tun, ist dies undefiniert und Sie erhalten immer noch nicht das gewünschte Ergebnis, aber zumindest erhalten Sie eine Warnung:
Um die erwarteten Ergebnisse zu erhalten, können Sie bind() verwenden:
bind() erstellt eine weitere Funktion, die den Wert dieser immer auf counter setzt.
4.3 Dies ausblenden
Wenn Sie eine Funktion in einer Methode verwenden, vergessen Sie oft, dass die Funktion ihr eigenes this hat. Dies unterscheidet sich von den Methoden, daher können Sie die beiden nicht miteinander kombinieren. Einzelheiten finden Sie im folgenden Code:
3. Verwenden Sie den zweiten Parameter von forEach. Der zweite Parameter von forEach wird an die Callback-Funktion übergeben und als dieser der Callback-Funktion verwendet.
5. Best Practices
Theoretisch denke ich, dass echte Funktionen keine eigene Funktion haben, und die obige Lösung basiert auch auf dieser Idee. ECMAScript 6 verwendet Pfeilfunktionen, um diesen Effekt zu erzielen. Pfeilfunktionen sind Funktionen, die kein eigenes This haben. In einer solchen Funktion können Sie dies beiläufig verwenden und müssen sich keine Gedanken darüber machen, ob es implizit vorhanden ist.
Mir gefällt nicht, dass einige APIs dies als zusätzlichen Parameter der eigentlichen Funktion behandeln: