Dies ist ein spezielles Objekt in der Funktion. Dies bezieht sich auf das Umgebungsobjekt, auf dem die Funktion ausgeführt wird (wir werden am Ende des Artikels zusätzliche Erklärungen abgeben). Der Wert davon ist nicht sicher, bevor Sie die Funktion aufrufen. Unterschiedliche Aufrufmethoden führen dazu, dass sich dieser Wert ändert.
Fenster.num = 22; var o = {num: 11}; Funktion Saynum () {alert (this.num)} saynum (); // 22o.saynum = saynum; o.saynum (); // 11Denken Sie daran: Der Funktionsname ist nur eine Variable, die einen Zeiger enthält. Selbst wenn es in verschiedenen Umgebungen ausgeführt wird, ist die globale Funktion Saynum () immer noch dieselbe Funktion wie O.Saynum ().
1. Beim Aufrufen einer Funktion im globalen Bereich
Dieses Objekt bezieht sich auf das Fenster
Die Ausführung anonymer Funktionen ist global, daher zeigt dieses Objekt normalerweise auch auf Fenster.
Funktion fn1 () {console.log (this);} fn1 ();2. Durch den neuen Bediener gerufen
Dies bezieht sich auf ein Instanzobjekt
Funktionsperson (Name) {this.name = name;} Person.Prototype.printname = function () {alert (this.name); // Byron}; var p1 = new Person ('Byron');3.. Methodenaufrufe als Objekte
Dies bezieht sich auf das Objekt
var obj1 = {name: 'byron', fn: function () {console.log (this); }}; obj1.fn ();4. Indirekter Anruf
Rufen Sie an und bewerben Sie sich
Jede Funktion enthält zwei nicht unterhörte Methoden: call () und anwenden (). Der Zweck dieser beiden Methoden besteht darin, Funktionen in einem bestimmten Bereich aufzurufen, was tatsächlich gleichbedeutend mit der Festlegung des Werts dieses Objekts in der Funktionskörper ist. Mit anderen Worten, die Funktion wird direkt aufgerufen und die Ausführungsumgebung wird beim Aufrufen angegeben
window.color = 'rot'; var o = {color: 'blau'}; Funktion SaysColor () {alert (this.color);} SayColor.call (this); // Redsaycolor.call (Fenster); // Redsaycolor.call (O); // Blue Blue Blue (Blue Blue); // Blue Blue (O); // Blue Blue (O); // Blue Blue (O); // Blue Blue (O); // Blue Blue (O); // Blue Blue (O).(1) Methode anwenden
Empfangen Sie zwei Parameter, einer ist der Umfang der in der Funktion ausgeführten Funktion und das andere das Parameterarray.
(2) Anrufmethode
Die Aufrufmethode entspricht der Anwendenmethode, der Unterschied besteht darin, dass die Methode zum Empfangen von Parametern unterschiedlich ist. Für die Anrufmethode ist der erste Parameter, dass sich dieser Wert nicht geändert hat und die Änderung ist, dass die anderen Parameter direkt an die Funktion übergeben werden.
Funktion fn () {console.log (this) // windwow function innerfn () {console.log (this)} Innerfn.call (this) // window} fn (); Funktion fn0 () {console.log (this) // Fenster} Funktion fn1 () {fn0.call (this); console.log (this); // fenster} fn1 (); Funktion fn0 () {console.log (this) // Objekt} var o = {fn1: Funktion fn1 () {fn0.call (this); console.log (this); // Objekt}} o.fn1 ();5.Bindmethode
Diese Methode erstellt eine Instanz der Funktion, deren Wert an den Wert gebunden ist, der an die Bind () -Funktion übergeben wird. Das heißt, eine neue Funktion wird zurückgegeben und diese innerhalb der Funktion wird der erste Parameter sein.
window.color = 'rot'; var o = {color: 'blau'}; Funktion sageColor () {alert (this.color)} var ObjectSayColor = SayColor.bind (o); ObjectSayColor (); // BlueErgänzende Hinweis: Umgebungsdefinition führen
Definiert Variablen oder andere Daten, die die Funktionen zugreifen können. Jede Ausführungsumgebung ist mit einem variablen Objekt zugeordnet. Alle in der Umgebung definierten Variablen und Funktionen werden in diesem Objekt gespeichert. Der Code, den wir schreiben, kann nicht auf dieses Objekt zugreifen, aber der Parser verwendet ihn im Hintergrund bei der Verarbeitung der Daten.
1. Erstellung der Ausführungsumgebung:
1. Globales Ausführungsumfeld
In einem Webbrowser wird die globale Ausführungsumgebung als Fensterobjekt angesehen, sodass alle globalen Variablen und Funktionen als Eigenschaften und Methoden des Fensterobjekts erstellt werden. Wenn der Code in den Browser geladen wird, wird die globale Ausführungsumgebung erstellt (die globale Ausführungsumgebung wird nur zerstört, wenn wir die Webseite oder den Browser schließen).
2. lokale Ausführungsumgebung
Jede Funktion hat eine eigene Ausführungsumgebung, sodass die lokale Ausführungsumgebung ein Funktionsobjekt ist. Wenn eine Funktion aufgerufen wird, wird die lokale Umgebung der Funktion erstellt (nachdem der Code in der Funktion ausgeführt wurde, wird die Umgebung zerstört und alle in IT gespeicherten Variablen und Funktionsdefinitionen werden ebenfalls zerstört).
Diese Ausführungsumgebung und verwandte variable Objekte sind ein abstraktes Konzept, das wie folgt erklärt wird
var a = 1; Funktion fn (num1, num2) {var b = 2; Funktion fninner () {var c = 3; Alarm (a + b + c); } fninner (); // Lokale Ausführungsumgebung Erstellung, wenn fninner} fn (4,5) genannt wird2. Bereichskette
Die Ausführung von JavaScript -Funktionen verwendet eine Scope -Kette. Diese Bereichskette wird erstellt, wenn die Funktion definiert ist. Wenn eine Funktion definiert ist, speichert sie tatsächlich eine Bereichskette. Wenn diese Funktion aufgerufen wird, erstellt sie ein neues Objekt, um ihre lokalen Variablen zu speichern, und fügt dieses Objekt zur gespeicherten Bereichskette hinzu. Das vordere Ende der Bereichskette ist immer ein variables Objekt in der Umgebung, in der sich der derzeit ausgeführte Code befindet. Das Ende der Bereichskette ist immer ein variables Objekt der globalen Ausführungsumgebung. Der Zweck der Bereichskette besteht darin, sicherzustellen, dass alle Variablen und Funktionen, die die Erlaubnis haben, auf die Ausführungsumgebung zuzugreifen, zugreifen dürfen.
var scope = 'globaler Bereich'; Funktion CheckScope () {var scope = 'lokaler Bereich'; Funktion f () {return Scope}; return f;} CheckScope () (); // Lokaler BereichVerständnis: Wenn CheckScope aufgerufen wird, wird die Funktion F definiert und an die CheckScope Scope -Kette als lokale Variable gebunden. Unabhängig davon, wo die Funktion F aufgerufen wird, ist diese Bindung immer noch gültig, sodass der Rückgabewert lokaler Bereich ist.
var num1 = 1; function outer () {var num2 = 2; console.log (num1 + num2); // 3 Funktion inner () {// Hier können Sie auf Num3, Num2, Num1 var num3 = 3 zugreifen; console.log (num1 + num2 + num3); // 6} // Hier können Sie auf num2, inner (), num1, aber nicht num3 inner ();} ober (); console.log (num1); // 1, Ausführungsumgebung // Zugreifen Sie nur auf num1 zugreifenSCOPE -Kette (Suche): Die interne Umgebung kann über die Bereichskette auf alle externen Umgebungen zugreifen, aber die externe Umgebung kann in der internen Umgebung nicht auf Variablen und Funktionen zugreifen.
var name = 'byron'; Funktion fn () {var name = 'CSPER'; console.log (name); // casper} fn ();Je intern die Umgebung ist, desto höher ist das variable Gewicht.
Hinweis: Variablen, die nicht direkt mit dem VAR -Schlüsselwort deklariert werden, sind globale Variablen. Wenn beispielsweise a = 1 direkt deklariert ist, ist a zu diesem Zeitpunkt eine globale Variable.
Wenn die Javscript -Engine eingeht, wird der Code in zwei Runden verarbeitet. In der ersten Runde initialisieren Sie die Variablen. In der zweiten Runde führen Sie den Code aus
var a = 1; Funktion Gefängnis (a) {console.log (a); // 1 var a; console.log (a); // 1} Gefängnis (1);3. Funktionsausführung
Wenn ein Funktionsaufruf in die Ausführungsumgebung eingeht, verarbeiten Sie zunächst Argumente, initialisieren Sie die formalen Parameter (der Standardwert ist undefiniert) und dann die Funktionserklärung in der Funktion initialisieren. Wenn der Code Schritt für Schritt ausgeführt wird, wird die Variablenerklärung in der Funktion initialisiert (wenn der Code nach Eingabe der Umgebung nicht ausgeführt wird, ist der Wert undefiniert). Daher sind die Initialisierungsreihenfolge in der Funktion formale Parameter, Funktionserklärungen und variable Deklarationen. Es ist aus dem Bild oben zu sehen. Lassen Sie mich ein Beispiel geben (die gesamte globale Umgebung ist auch eine Funktion).
alert (typeof fn); // Funktion, Funktionserklärung im Voraus Alert (typeof fn0); // undefinierte, variable Deklaration im Voraus, aber nicht zugewiesene Funktion fn () {// Funktionxpression} var fn0 = Funktion () {// Funktionsdefinition} alert (Typeof fn0); // Funktion, in diesem Zeitpunkt, in diesem Zeitpunkt zugeordnet wurde, wurde der Variable zugewiesen.