Vertieftes Verständnis davon in Js Umfang Lassen Sie uns zunächst den Gültigkeitsbereich von var a = 1; var s = Funktion(){ konsole.log(a); }; (Funktion(){ var a = 2; s(); // 1 })(); Wenn s() aufgerufen wird, wird a als 1 ausgegeben. Dies ist ein statischer Bereich, d. h. der Bereich wird bei der Deklaration angegeben. Wenn es ein dynamischer Bereich ist, wird hier 2 ausgegeben. Die meisten Sprachen verwenden heute einen statischen Gültigkeitsbereich, beispielsweise Globaler Umfang Direkt auf der obersten Ebene deklarierte Variablen oder Methoden werden im globalen Gültigkeitsbereich ausgeführt. Verwenden Sie die Eigenschaft Funktion s(){} Konsole.Dir(s); /* ... [[Bereiche]]: Bereiche[1] 0: Global ... */ // Sie können sehen, dass die deklarierte s-Funktion im globalen Bereich ausgeführt wird. FunktionsumfangWenn eine Funktion deklariert wird, ist die Betriebsumgebung der innerhalb der Funktion deklarierten Methoden oder Mitglieder der Funktionsumfang der Funktion. (Funktion lokalerKontext(){ var a = 1; Funktion s(){ return a; } Konsole.Dir(s); })(); /* ... [[Bereiche]]: Bereiche[2] 0: Abschluss (lokaler Kontext) {a: 1} 1: Global ... */ // Sie können sehen, dass der Kontext, in dem die deklarierte s-Funktion ausgeführt wird, der Bereich der Funktion localContext ist, der auch als lokaler Bereich bezeichnet werden kann Blockbereich Wenn in einem Codeblock { sei a = 1; Funktion s(){Rückgabe a;} Konsole.Dir(s); /* ... [[Bereiche]]: Bereiche[2] 0: Blockieren {a: 1} 1: Global ... */ } // Sie können sehen, dass die deklarierte s-Funktion im Blockbereich ausgeführt wird, der auch der lokale Bereich ist. analysieren Bevor wir var obj = { Name: 1, sagen Sie: function() { gib diesen Namen zurück; } }; Fenster.name = 2; Fenster.sagen = Objekt.sagen; konsole.log(obj.say()); // 1 konsole.log(fenster.say()); // 2 Der Grund für dieses Ergebnis ist die Verwendung des Schlüsselworts verwenden Wir müssen bedenken, dass Standardbindung Der am häufigsten verwendete Funktionsaufruftyp ist der unabhängige Funktionsaufruf, der auch die niedrigste Priorität hat. var a = 1; // Variablendeklaration in der globalen Objektfunktion f1() { gib dies.a zurück; } Funktion f2() { "streng verwenden"; gib dies zurück; } console.log(f1()); // 1 // Ruft tatsächlich window.f1() auf und dies zeigt immer auf den Anrufer, also window console.log(f2()); // undefiniert // Tatsächlich wird window.f2() aufgerufen. Zu diesem Zeitpunkt ist dies innerhalb der Funktion undefiniert, da der strikte Modus „strict“ verwendet. Implizite Bindung Nur die oberste oder letzte Ebene in der Objekt-Eigenschaftsreferenzkette wird Funktion f() { konsole.log(dies.a); } var obj1 = { ein: 1, f: f }; var obj2 = { eine: 11, obj1: obj1 }; obj2.obj1.f(); // 1 // Die letzte Ebene der Anrufer ist obj1 Funktion f() { konsole.log(dies.a); } var obj1 = { ein: 1, f: f }; var obj2 = { eine: 11, }; obj2.f = obj1.f; // indirekte Referenz obj2.f(); // 11 // der Anrufer ist obj2 Bindung anzeigen Wenn wir eine Funktion in eine bestimmte Umgebung zwingen möchten, also ein Objekt, können wir window.name = "A"; // Name, der dem Fensterobjekt zugeordnet ist document.name = "B"; // Name, der dem Dokumentobjekt zugeordnet ist var s = { // Ein Objekt anpassen s Name: "C" } var rollCall = { Name: "Lehrer", sageName: function(){ konsole.log(dieser.name); } } rollCall.sayName(); // Lehrer // anwenden rollCall.sayName.apply(); // A // Es werden keine Parameter übergeben und das Standardfenster ist gebunden rollCall.sayName.apply(window); // A // Fensterobjekt binden rollCall.sayName.apply(document); // B // Dokumentobjekt binden rollCall.sayName.apply(s); // C // Benutzerdefiniertes Objekt binden // call rollCall.sayName.call(); // A // Es werden keine Parameter übergeben und das Standardfenster ist gebunden rollCall.sayName.call(window); // A // An Fensterobjekt binden rollCall.sayName.call(document); // B // An Dokumentobjekt binden rollCall.sayName.call(s); // C // An benutzerdefiniertes Objekt binden // binden // Das letzte () dient zur Ausführung rollCall.sayName.bind()(); //A // Standardbindung an Fenster ohne Übergabe von Parametern rollCall.sayName.bind(window)(); //A // Fensterobjekt binden rollCall.sayName.bind(document)(); //B // Dokumentobjekt binden rollCall.sayName.bind(s)(); // C // Benutzerdefiniertes Objekt binden Neue Bindung In Erstellt ein leeres, einfaches Funktion _new(Basis,...Argumente){ var obj = {}; obj.__proto__ = Basis.Prototyp; Basis.anwenden(Objekt, Argumente); gibt Objekt zurück; } Funktion Funct(a) { dies.a = a; } var f1 = neue Funktion(1); konsole.log(f1.a); // 1 var f2 = _new(Funktion, 1); konsole.log(f2.a); // 1 Pfeilfunktionen Pfeilfunktionen haben kein separates Fenster.name = 1; var obj = { Name: 11, sagen Sie: function(){ const f1 = () => { gib diesen Namen zurück; } console.log(f1()); // 11 // Der direkte Aufrufer ist window, aber da die Pfeilfunktion this nicht bindet, wird this im Kontext erhalten, also das obj-Objekt const f2 = function(){ gib diesen Namen zurück; } console.log(f2()); // 1 // Der direkte Aufrufer ist window, eine normale Funktion, also returniere this.name; } } console.log(obj.say()); // 11 // Der direkte Aufrufer ist obj. Das this des Kontexts in der Funktion während der Ausführung ist das obj-Objekt BeispielFunktion s(){ konsole.log(dies); } // Direkt im Fenster aufrufen // Nicht strikt verwenden s(); // Fenster // Entspricht window.s(), der Aufrufer ist window // Fenster ist eine Instanz von Fenster // Fensterinstanz von Fenster //true // Erstelle ein neues Objekt s1 var s1 = { t1: function(){ // Testen Sie, ob dies auf den Anrufer verweist console.log(this); // s1 s(); // Window // Dieser Aufruf ist immer noch äquivalent zu window.s(), der Aufrufer ist window }, t2: () => { // Pfeilfunktion testen, diese zeigt nicht auf den Anrufer console.log(this); }, t3: { // Objekt im Testobjekt tt1: function() { konsole.log(dies); } }, t4: { // Teste die Pfeilfunktion und den Nicht-Funktionsaufruf. Dieser zeigt nicht auf den Anrufer tt1: () => { konsole.log(dies); } }, t5: function(){ // Beim Testen eines Funktionsaufrufs zeigt der Pfeil dieser Funktion auf den Aufrufer des vorherigen Objekts. return { tt1: () => { konsole.log(dies); } } } } s1.t1(); // s1-Objekt // Der Aufrufer hier ist s1, also ist das gedruckte Objekt s1 s1.t2(); // Fenster s1.t3.tt1(); // s1.t3 Objekt s1.t4.tt1(); // Fenster s1.t5().tt1(); // s1-Objekt Dies ist das Ende dieses Artikels über ein vertieftes Verständnis von this in Js. Weitere relevante Inhalte zum vertieften Verständnis von this in Js finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Über MySQL innodb_autoinc_lock_mode
>>: Ausführliche Erklärung der Umgebungsvariablen und Konfigurationsdateien in CentOS
Inhaltsverzeichnis 1. Einleitung 2. Konfiguration...
Cockpit ist ein webbasiertes Serververwaltungstoo...
Ergebnis: html <nav id="nav-1"> &...
Der Befehl fd bietet eine einfache und unkomplizi...
Dies ist ein sehr einfacher, reiner CSS3-Hintergr...
Bei der Entwicklung von Web-Frontends entwerfen U...
Als ich zum ersten Mal mit Docker in Berührung ka...
1. Rufen Sie die Methode der übergeordneten Kompo...
System: CentOS 7 RPM-Pakete: mysql-community-clie...
Als nützlicher Terminalemulator wird Xshell häufi...
Schlägt die Remote-Verbindung zu MySQL fehl, kann...
Inhaltsverzeichnis 1. Einleitung 2. Sichern Sie d...
Vorwort Ich habe zuvor eine Komponente im Ladesti...
Inhaltsverzeichnis Vorwort Referenzvergleich Manu...
1. Einführung in mysqldump mysqldump ist ein logi...