JavaScript ist eine Skriptsprache, die erweiterte Funktionen wie funktionale Programmierung, Schließungen, prototypbasiertes Erbe usw. unterstützt. Unter ihnen ist das Schlüsselwort dies in JavaScript ein relativ verwirrendes Konzept. In verschiedenen Szenarien wird dies zu unterschiedlichen Objekten. Es gibt eine Ansicht, die Sie nur durch korrektes Beherrschen dieses Schlüsselworts in JavaScript den Schwellenwert der JavaScript -Sprache eingeben können. In Mainstream-objektorientierten Sprachen (wie Java, C#usw.) bedeutet dies klar und spezifisch, dh auf das aktuelle Objekt. Im Allgemeinen während der Kompilierungsperiode gebunden. Dies ist während der Laufzeit in JavaScript gebunden, was der wesentliche Grund ist, warum dieses Schlüsselwort mehrere Bedeutungen in JavaScript aufweist.
Aufgrund seiner Bindungsfunktion während der Laufzeit kann dies in JavaScript ein globales Objekt, ein aktuelles Objekt oder ein beliebiges Objekt sein, das vollständig von der Aufforderung der Funktion abhängt. Es gibt verschiedene Möglichkeiten, Funktionen in JavaScript aufzurufen:
Als Objektmethode genannt;
als Funktionsaufruf;
Als Konstruktor gerufen;
Verwenden Sie Bewerbung oder Anruf, um anzurufen.
Wie das Sprichwort sagt, ist ein Charakter nicht so gut wie eine Form und eine Form ist nicht so gut wie ein Bild. Damit die Menschen besser verstehen, auf welchen JavaScript dies zeigt? Hier ist ein Bild zu erklären:
Im obigen Bild nenne ich es "JavaScript diesen Entscheidungsbaum" (im Nichtstreifenmodus). Das Folgende ist ein Beispiel, um zu veranschaulichen, wie diese Figur uns helfen kann, dies zu beurteilen:
var point = {x: 0, y: 0, moveTo: function (x, y) {this.x = this.x + x; this.y = this.y + y; }}; // Entscheidungsbaum Erläuterung: Der Punkt.moveto (1,1) -Funktion ist nicht für neu, fährt das Veto ein, // wird mit Punkt (.) Aufgerufen und zeigt dann auf das Anrufobjekt vor .moveto, dh pointpoint.moveto (1,1); // Dies ist an das aktuelle Objekt gebunden, dh PunktobjektWird der Punkt.Moveto -Funktionsaufruf mit neu aufgerufen? Das ist offensichtlich nicht. Wenn Sie in den "Nein" -Ast gehen, heißt es die Funktion mit Punkt (.)? ;
Der Punkt.Moveto -Funktion wird mit Punkt (.) Aufgerufen, dh in den "Ja" -Ast, das heißt, hier zeigt dies auf den Objektpunkt vor Punkt.moveto.
Das Analysediagramm dessen Punkt im Abbildung Punkt.Moveto -Funktion ist in der folgenden Abbildung dargestellt:
Geben wir ein anderes Beispiel an, sehen Sie sich den folgenden Code an:
Funktion func (x) {this.x = x; } func (5); // Dies ist ein globales Objektfenster, x ist eine globale Variable // Entscheidungsbaumanalyse: Wird die Funktion func () mit neu aufgerufen? Zu nein, wird es beim Betreten der Funktion func () mit Punkt aufgerufen? Zu Nein, dies zeigt auf das globale Objekt Windowx; // x => 5Der Prozess der Ermittlung der Funktion func () in "JavaScript this Entscheidungsbaum" ist wie folgt:
Wird der Funktionsaufruf von Func (5) mit neu aufgerufen? Das ist offensichtlich nicht. Wenn Sie in den "Nein" -Ast gehen, heißt es die Funktion mit Punkt (.)? ;
Die Funktion des Func (5) wird nicht mit Punkt (.) Aufgerufen, dh in den "Nein" -Ast, dh dieser Punkt zum globalen Variablenfenster, dann ist dies.x tatsächlich Fenster.x.
Das Analysediagramm dessen, worauf diese Funktionsfunktion zeigt, ist in der folgenden Abbildung dargestellt:
Für die direkte Aufrufmethode als Funktion sehen wir ein komplexes Beispiel:
var point = {x: 0, y: 0, moveTo: function (x, y) {// innere Funktion var movex = Funktion (x) {this.x = x; // worauf zeigt dieser? Fenster }; // Die interne Funktion var movey = function (y) {this.y = y; // worauf zeigt dieser? Fenster }; Movex (x); Movey (y); }}; point.moveto (1,1); point.x; // => 0 point.y; // => 0 x; // => 1 y; // => 1Der tatsächliche interne Ruf der Movex () und Movey () Funktionen. Der Prozess der Bestimmung dieser Inneren der Movex () -Funktion im "JavaScript this Entscheidungsbaum" ist wie folgt:
Wird der Funktionsaufruf von Movex (1) mit neu aufgerufen? Das ist offensichtlich nicht. Wenn Sie in den "Nein" -Ast gehen, heißt es die Funktion mit Punkt (.)? ;
Die Movex (1) -Funktion wird nicht mit Punkt (.) Aufgerufen, dh in den "Nein" -Ast, dh dies zeigt, dass dies hier auf das globale Variablenfenster zeigt, dann ist dies tatsächlich Fenster.x.
Schauen wir uns das Beispiel eines Konstruktoraufrufs an:
Funktionspunkt (x, y) {this.x = x; // Das ? this.y = y; // this?} var np = neuer Punkt (1,1); np.x; // 1var p = Punkt (2,2); PX; // Fehler, P ist ein leeres Objekt undefinedwindow.x; // 2Der Prozess der Bestimmung dieser in der Funktion "JavaScript this Entscheidungsbaum" in der Funktion (1,1) ist wie folgt:
var np = neu ist der Punkt (1,1) mit neuer Aufruf von neu? Dies ist offensichtlich, wenn Sie in den "Ja" -Ast eingeben, das heißt, dies zeigt auf NP;
Dann dies.x = 1, dh np.x = 1;
Der Prozess der Bestimmung dieser in der Funktion "JavaScript this Entscheidungsbaum" des Punktes (2,2) in var p = Punkt (2,2) ist wie folgt:
Wird der var p = Punkt (2,2) mit neuem Aufruf aufgerufen? Das ist offensichtlich nicht. Wenn Sie in den "Nein" -Ast gehen, heißt es die Funktion mit Punkt (.)? ;
Ist die Punktfunktion (2,2) nicht mit Punkt (.) Aufgerufen? Als nein bestimmt, dh eingeben Sie den "no" -Ast, dh dies verweist hier auf das globale Variablenfenster, dann ist dies.x tatsächlich Fenster.x;
This.x = 2 bedeutet Fenster.x = 2.
Schauen wir uns schließlich das Beispiel des Aufrufens von Funktionen mit Anruf an und bewerben Sie sich: Bewerben:
Funktionspunkt (x, y) {this.x = x; this.y = y; this.moveto = function (x, y) {this.x = x; this.y = y; }} var p1 = neuer Punkt (0, 0); var p2 = {x: 0, y: 0}; p1.moveto.Apply (p2, [10, 10]); // bewerben ist tatsächlich p2.moveto (10, 10) p2.x // 10Der Prozess der Bestimmung der Funktion p1.moveto.Apply (P2, [10,10]) im "JavaScript this Entscheidungsbaum" lautet wie folgt:
Wir wissen, dass sich die beiden Methoden anwenden und aufrufen, und sie ermöglichen das Umschalten des Kontextes der Funktionsausführung, dh das daran gebundene Objekt. p1.moveto.apply (p2, [10,10]) ist tatsächlich p2.moveto (10,10). Dann kann p2.moveto (10,10) interpretiert werden wie:
Wird der Funktionsaufruf mit neu aufgerufen? Das ist offensichtlich nicht. Wenn Sie in den "Nein" -Ast gehen, heißt es die Funktion mit Punkt (.)? ;
Die Funktion P2.Moveto (10,10) wird mit Punkt (.) Aufgerufen, dh in den "Ja" -Ast, dh, zeigt dies auf das Objekt P2 in P2.Moveto (10,10). zuvor, so p2.x = 10.
In Bezug auf den Prozess der Ausführungsumgebung für JavaScript -Funktionen fühlt sich eine Beschreibung in der IBM DeveloperWorks -Dokumentbibliothek sehr gut an und der Auszug lautet wie folgt:
"Funktionen in JavaScript können als gewöhnliche Funktionen oder als Objekte ausgeführt werden, was der Hauptgrund ist, warum dies so reich ist. Wenn eine Funktion ausgeführt wird, wird eine Ausführungsumgebung (ExecutionContext) erstellt, und alle Verhaltensweisen der Funktion treten in dieser Ausführungsumgebung auf. Wenn die Ausführungsumgebung erstellt wurde. Initialisieren Sie die variable, die formale Parameter -Tabelle initialisieren, der Wert ist der entsprechende Wert in der Variablen der Argumente. und ihre Zuordnungsoperation wird nur ausgeführt, wenn die Funktion nach der Ausführungsumgebung (ExecutionContext) ausgeführt wird. wird erfolgreich erstellt, und die Funktion beginnt, Zeile nach Zeile auszuführen, und die erforderlichen Variablen werden aus der Execution -Umgebung (ExecutionContext) gelesen, die zuvor erstellt wurde. "
Das Verständnis dieser Passage wird vom Verständnis von JavaScript -Funktionen von großem Nutzen sein.