JavaScript - das this-Keyword

Hallo da draußen, angehende JavaScript-Entwickler! Heute machen wir uns auf eine aufregende Reise in die Welt des this-Keywords. Als dein freundlicher Nachbarschaftsinformatiklehrer bin ich hier, um dich durch dieses manchmal knifflige, aber immer faszinierende Konzept zu führen. Also hole dir dein liebstes Getränk, setze dich bequem hin, und tauchen wir ein!

JavaScript - this Keyword

Was ist das this-Keyword?

Stell dir vor, du bist auf einer Party, und jemand ruft "Hey, du!" Wer würde sich umdrehen? Jeder, oder? Aber wenn sie sagten "Hey, Sarah!" würde nur Sarah antworten. In JavaScript ist das this-Keyword so, als würde man "Hey, du!" zu einem Objekt sagen. Es ist eine Möglichkeit, auf das aktuelle Objekt im Kontext zu verweisen.

Das this-Keyword ist ein spezieller Bezeichner, der automatisch in dem Gültigkeitsbereich jeder Funktion definiert ist. Aber hier ist der Haken - sein Wert wird durch die Art und Weise bestimmt, wie eine Funktion aufgerufen wird. Diese dynamische Natur von this ist das, was es sowohl mächtig als auch manchmal verwirrend macht.

Auf welches Objekt bezieht sich this?

Jetzt wird es interessant. Das Objekt, auf das this verweist, kann je nach Verwendung und Ort variieren. Es ist wie ein Chamäleon, das seine Farben basierend auf seiner Umgebung ändert. Sehen wir uns einige Szenarien an:

Syntax

Bevor wir tiefer einsteigen, schauen wir uns schnell an, wie wir this verwenden:

console.log(this);

Einfach, oder? Aber lass dich nicht von seiner Einfachheit täuschen. Die Magie (oder das Unheil) passiert, wenn wir es in verschiedenen Kontexten verwenden.

JavaScript this im Globalen Gültigkeitsbereich

Wenn this im globalen Gültigkeitsbereich (außerhalb jeder Funktion) verwendet wird, bezieht es sich auf das globale Objekt. In einem Browser ist das usually das window-Objekt.

console.log(this === window); // true

this.myGlobalVar = "Ich bin global!";
console.log(window.myGlobalVar); // "Ich bin global!"

Hier ist this wie der VIP-Pass, der dir Zugang zu der gesamten Party (globaler Gültigkeitsbereich) gibt.

JavaScript this in einer Funktion

Wenn this in einer regulären Funktion verwendet wird, hängt sein Wert davon ab, wie die Funktion aufgerufen wird.

function showThis() {
console.log(this);
}

showThis(); // window (im nicht-strengen Modus)

In diesem Fall ist this wie ein verirrter Welpe, der sich an alles anhängt, was in der Nähe ist - was im nicht-strengen Modus das globale Objekt ist.

this in einer Funktion im Strengen Modus

Der strenge Modus ist wie der strenge Lehrer, der dir nichts durchgehen lässt. Im strengen Modus ist this innerhalb einer Funktion undefined,除非明确设置。

"use strict";
function strictThis() {
console.log(this);
}

strictThis(); // undefined

this in einer Konstruktorenfunktion

Wenn eine Funktion als Konstruktor (mit dem new-Keyword) verwendet wird, bezieht sich this auf das neu erstellte Objekt.

function Person(name) {
this.name = name;
this.greet = function() {
console.log("Hallo, ich bin " + this.name);
};
}

const john = new Person("John");
john.greet(); // "Hallo, ich bin John"

Hier ist this wie die Geburtsurkunde, die die Identität des neu geborenen Objekts festlegt.

this in einer Pfeilfunktion

Pfeilfunktionen sind die Rebellen der JavaScript-Welt. Sie binden ihr eigenes this nicht, sondern erben es vom umgebenden Gültigkeitsbereich.

const obj = {
name: "Alice",
sayHello: () => {
console.log("Hallo, " + this.name);
}
};

obj.sayHello(); // "Hallo, undefined"

In diesem Fall bezieht sich this in der Pfeilfunktion nicht auf obj, sondern auf den umgebenden Gültigkeitsbereich (wahrscheinlich den globalen Gültigkeitsbereich).

this in der Methode eines Objekts

Wenn this in einer Methode (einer Funktion, die eine Eigenschaft eines Objekts ist) verwendet wird, bezieht es sich auf das Objekt, auf dem die Methode aufgerufen wurde.

const car = {
brand: "Toyota",
getBrand: function() {
return this.brand;
}
};

console.log(car.getBrand()); // "Toyota"

Hier ist this wie ein treuer Diener, der immer auf seinen Meister (das Objekt) verweist.

this in einer Kindfunktion einer Objektmethode

Hier kann es trickreich werden. In einer Funktion innerhalb einer Methode bezieht sich this nicht mehr auf das Objekt.

const restaurant = {
name: "Leckere Leckereien",
getMenu: function() {
function displayName() {
console.log(this.name);
}
displayName();
}
};

restaurant.getMenu(); // undefined

In diesem Fall bezieht sich this in displayName() auf das globale Objekt, nicht auf restaurant.

JavaScript this in Ereignis-Handler

In Ereignis-Handler refers this typischerweise auf das Element, das das Ereignis empfangen hat.

<button id="myButton">Klicke mich!</button>

<script>
document.getElementById("myButton").addEventListener("click", function() {
console.log(this); // <button id="myButton">Klicke mich!</button>
});
</script>

Hier ist this wie ein Spotlight, das auf den Star der Show - das geklickte Element - fokussiert.

Explizite Funktionsbindung in JavaScript

Manchmal wollen wir this genau sagen, was es sein soll. Wir können das mit call(), apply() oder bind() tun.

const person1 = { name: "Alice" };
const person2 = { name: "Bob" };

function sayHello() {
console.log("Hallo, " + this.name);
}

sayHello.call(person1); // "Hallo, Alice"
sayHello.apply(person2); // "Hallo, Bob"

const boundHello = sayHello.bind(person1);
boundHello(); // "Hallo, Alice"

Diese Methoden sind wie ein Regisseur, der this genau sagt, welche Rolle es spielen soll.

JavaScript this-Priorität

Nun, lassen Sie uns die Priorität der this-Bindung zusammenfassen:

Regel Priorität
new-Keyword 1 (Höchste)
Explizite Bindung (call, apply, bind) 2
Methodenaufruf 3
Funktionsaufruf 4 (Niedrigste)

Denken Sie daran, dass Pfeilfunktionen besonders sind und immer this vom umgebenden Gültigkeitsbereich erben.

Und das war's, Leute! Wir haben die Welt des this bereist und seine vielen Gesichter und Eigenarten erkundet. Denken Sie daran, das Verständnis von this ist wie das Fahrradfahren - es mag am Anfang wackelig sein, aber mit Übung werden Sie schnell davonfliegen. Weiter codieren, weiter erkunden und vor allem: Viel Spaß mit JavaScript!

Credits: Image by storyset