Heim > Web-Frontend > js-Tutorial > Hauptteil

Ausführliche Antwort darauf in JavaScript (grafisches Tutorial)

亚连
Freigeben: 2018-05-19 10:45:36
Original
1153 Leute haben es durchsucht

Das This-Objekt einer Funktion in JavaScript ist der Bereich, in dem die Funktion ausgeführt wird (Beispiel: Wenn eine Funktion im globalen Bereich einer Webseite aufgerufen wird, bezieht sich dieses Objekt auf das Fenster).

Dies unterscheidet sich in JavaScript stark von objektorientierten Sprachen wie Java. Die Funktionen bind(), call() und apply() erweitern die Flexibilität noch weiter.

Um die Lesbarkeit zu gewährleisten, verwendet dieser Artikel eine freie Übersetzung anstelle einer wörtlichen Übersetzung. Darüber hinaus liegt das Urheberrecht dieses Artikels beim ursprünglichen Autor und die Übersetzung dient nur zum Lernen.

Wenn Sie das JavaScript-Schlüsselwort nicht so tiefgreifend verstehen, kann es sein, dass Sie manchmal in unerwartete Schwierigkeiten geraten. Hier haben wir 5 allgemeine Regeln zusammengefasst, die Ihnen helfen sollen, herauszufinden, worauf das eigentlich hinweist. Obwohl nicht alle Situationen abgedeckt sind, können anhand dieser Regeln die meisten Alltagssituationen korrekt abgeleitet werden.

Der Wert davon wird normalerweise durch die Ausführungsumgebung der Funktion bestimmt, was bedeutet, dass er davon abhängt, wie die Funktion aufgerufen wird.
Jedes Mal, wenn dieselbe Funktion aufgerufen wird, kann dies auf ein anderes Objekt verweisen ;

Globales Objekt

Öffnen Sie das Chrome-Entwicklerfenster (Windows: Strg + Umschalt + J) (Mac: Befehlstaste + Wahltaste + J) und geben Sie Folgendes ein:

console.log(this);

und sehen, was ausgegeben wird?

// Window {}
Nach dem Login kopieren

Fensterobjekt! Denn im globalen Bereich zeigt dies auf das globale Objekt. Das globale Objekt im Browser ist das Fensterobjekt.
Um Ihnen ein klareres Verständnis dafür zu geben, warum dies auf das Fensterobjekt verweist, schauen wir uns ein weiteres Beispiel an:

var myName = 'Brandon';
Wir können auf seinen Wert zugreifen, indem wir myName in die Konsole eingeben:

myName
// 输出 'Brandon'
Nach dem Login kopieren

Tatsächlich sind alle global definierten Variablen an das Fensterobjekt gebunden. Lassen Sie uns den folgenden Test durchführen:

window.myName
// 输出 'Brandon'
window.myName === myName
// 输出 true
Nach dem Login kopieren

Jetzt fügen wir dies in die Funktion ein und sehen, welchen Effekt es hat.

function test(){
 return this;
}
test();
Nach dem Login kopieren

Sie werden feststellen, dass dies immer noch auf das globale Fensterobjekt verweist. Da sich das Schlüsselwort this nicht in einem deklarierten Objekt befindet, wird standardmäßig das globale Fensterobjekt verwendet. Dies kann für die meisten Anfänger etwas schwierig zu verstehen sein. Nachdem Sie diesen Artikel gelesen haben, werden Sie es plötzlich verstehen.
Hinweis: Im Strcit-Modus ist dies im obigen Beispiel undefiniert.

Deklariertes Objekt

Wenn das Schlüsselwort this in einem deklarierten Objekt verwendet wird, wird sein Wert an die nächstgelegene Funktion gebunden, die dieses übergeordnete Objekt aufruft. Lassen Sie uns ein Beispiel verwenden, um dieses Problem zu veranschaulichen:

var person = {
 first: 'John',
 last: 'Smith', 
 full: function() {
  console.log(this.first + ' ' + this.last);
 }
};
person.full();
// 输出 'John Smith'
Nach dem Login kopieren

verwendet dies in der vollständigen Funktion des deklarierten Objekts Person, dann ist das nächste übergeordnete Objekt der vollständigen Funktion, die dies aufruft, Person, also zeigt dies auf Person.

Um besser zu beschreiben, dass dies tatsächlich auf das Personenobjekt verweist, können Sie den folgenden Code in die Browserkonsole kopieren und ausdrucken.

var person = {
 first: 'John',
 last: 'Smith', 
 full: function() {
  console.log(this);
 }
};
person.full();
// 输出 Object {first: "John", last: "Smith", full: function}
Nach dem Login kopieren

Sehen wir uns als Nächstes ein komplexeres Beispiel an:

var person = {
 first: 'John',
 last: 'Smith',
 full: function() {
  console.log(this.first + ' ' + this.last);
 },
 personTwo: {
  first: 'Allison',
  last: 'Jones',
  full: function() {
   console.log(this.first + ' ' + this.last);
  }
 }
};
Nach dem Login kopieren

Hier haben wir verschachtelte Objekte. Auf wen weist das derzeit hin? Drucken wir es aus und werfen wir einen Blick darauf:

person.full();
// 输出 'John Smith'
person.personTwo.full();
// 输出 'Allison Jones'
Nach dem Login kopieren

Sie werden feststellen, dass die zuvor beschriebenen Regeln erfüllt sind: Sein Wert wird an das nächstgelegene übergeordnete Objekt der Funktion gebunden, die dies aufgerufen hat.

neues Schlüsselwort

Wenn Sie das neue Schlüsselwort zum Erstellen eines neuen Objekts verwenden, wird dieses an das neue Objekt gebunden. Schauen wir uns ein Beispiel an:

function Car(make, model) {
 this.make = make;
 this.model = model;
};
Nach dem Login kopieren

Basierend auf der ersten Regel können Sie daraus schließen, dass dies auf das globale Objekt verweist. Wenn wir jedoch das Schlüsselwort new verwenden, um eine neue Variable zu deklarieren, wird diese in der Car-Funktion an ein neues leeres Objekt gebunden und dann werden die Werte von this.make und this.model initialisiert.

var myCar = new Car('Ford', 'Escape');
console.log(myCar);
// 输出 Car {make: "Ford", model: "Escape"}
Nach dem Login kopieren

Aufrufen, binden und anwenden

Wir können das Bindungsobjekt davon explizit in call(), bind() und apply() festlegen. Diese drei Funktionen sind sehr ähnlich, wir müssen jedoch auf ihre subtilen Unterschiede achten.

Sehen wir uns ein Beispiel an:

function add(c, d) {
 console.log(this.a + this.b + c + d);
}
add(3,4);
// 输出 NaN
Nach dem Login kopieren

Die Add-Funktion gibt NaN aus, da this.a und this.b undefiniert sind.

Jetzt stellen wir das Objekt vor und verwenden call() und apply(), um Folgendes aufzurufen:

function add(c, d) {
 console.log(this.a + this.b + c + d);
}
var ten = {a: 1, b: 2};
add.call(ten, 3, 4);
// 输出 10
add.apply(ten, [3,4]);
// 输出 10
Nach dem Login kopieren

Wenn wir add.call() verwenden, ist der erste Parameter das Objekt, das dies sein muss gebunden an , der Rest sind die ursprünglichen Parameter der Add-Funktion.
Daher zeigt this.a auf ten.a und this.b auf ten.b. add.apply() ist ähnlich, außer dass der zweite Parameter ein Array zum Speichern der Parameter der Add-Funktion ist.

Die Funktion bind() ähnelt call(), die Funktion bind() wird jedoch nicht sofort aufgerufen. Die Funktion bind() gibt eine Funktion zurück und bindet diese. Als nächstes verwenden wir ein Beispiel, um das Anwendungsszenario der Funktion bind() zu verstehen:

var small = {
 a: 1,
 go: function(b,c,d){
  console.log(this.a+b+c+d);
 }
}
var large = {
 a: 100
}
Nach dem Login kopieren

Ausführung:

small.go(2, 3, 4);
// 输出 10
Nach dem Login kopieren

Was wäre, wenn wir den Wert von large.a anstelle von small verwenden möchten? .A? Wir können call/apply:

small.go.call(large, 2, 3, 4);
// 输出 109
Nach dem Login kopieren

verwenden. Was sollen wir jedoch tun, wenn wir noch nicht wissen, welche Werte für diese drei Parameter übergeben werden sollen? Wir können bind:

var bindTest = small.go.bind(large, 2);

Wenn wir bindTest auf der Konsole drucken, sehen wir:

console.log(bindTest);
// 输出 function (b,c,d){console.log(this.a+b+c+d);}
Nach dem Login kopieren

Hinweis: Diese Funktion hat diese Bindung bereits in geändert großes Objekt, und der erste Parameter b wird übergeben. Daher müssen wir als nächstes die restlichen Parameter übergeben:

bindTest(3, 4);
// 输出 109
Nach dem Login kopieren

Das Obige habe ich für alle zusammengestellt. Ich hoffe, dass es in Zukunft für alle hilfreich sein wird.

Verwandte Artikel:

Das Zeigen von dies in JS und die Funktionen von Aufrufen und Anwenden (Bild- und Text-Tutorial)

dies und die Rolle von Call und Apply_Grundkenntnisse

Der Unterschied zwischen self, static, $this in PHP und ausführliche Erklärung der neuesten statischen Bindung

Das obige ist der detaillierte Inhalt vonAusführliche Antwort darauf in JavaScript (grafisches Tutorial). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!