this
mit .bind()
, .call()
und .apply()
kontrollieren: Funktionen flexibel binden
JavaScript ist eine flexible Sprache, insbesondere wenn es darum geht, Funktionen losgelöst von ihrem ursprünglichen Kontext zu verwenden. Das hat viele Vorteile, führt aber auch dazu, dass der Bezug zu this
verloren gehen kann. Genau hier kommen .bind()
, .call()
und .apply()
ins Spiel.
Mit diesen Methoden kannst du den Kontext, also den Wert von this
, explizit setzen. So stellst du sicher, dass deine Funktion immer mit dem gewünschten Objekt arbeitet, unabhängig davon, wie und wann sie aufgerufen wird.
In diesem Beitrag erklären wir die Unterschiede zwischen .bind()
, .call()
und .apply()
, zeigen dir, wann du welche Methode einsetzt, und wie du damit typische this
-Fehler elegant vermeidest.
Der Klassiker: Methoden verlieren this
außerhalb ihres Objekts
Nehmen wir folgendes Beispiel:
const user = {
name: "Luna",
greet() {
console.log(`Hallo, ich bin ${this.name}`);
}
};
user.greet(); // "Hallo, ich bin Luna"
const sayHi = user.greet;
sayHi(); // undefined – `this` zeigt nicht mehr auf `user`
Hier geht der Methoden-Kontext verloren, weil sayHi()
nicht mehr über das Objekt user
aufgerufen wird. Die Funktion wird losgelöst verwendet und this
zeigt im besten Fall auf das globale Objekt (im schlechtesten auf undefined
im Strict Mode).
.bind()
: Eine neue Funktion mit festem this
Die Methode .bind()
erzeugt eine neue Funktion, bei der this
dauerhaft auf ein bestimmtes Objekt gesetzt ist.
const boundGreet = user.greet.bind(user);
boundGreet(); // "Hallo, ich bin Luna"
Das Original bleibt dabei unverändert:
user.greet(); // weiterhin "Hallo, ich bin Luna"
Wann nutzen?
Immer dann, wenn du eine Funktion an anderer Stelle weitergeben möchtest (z. B. als Callback oder Event-Handler), aber sicherstellen willst, dass this
erhalten bleibt.
Praxisbeispiel:
function Button(label) {
this.label = label;
this.click = this.click.bind(this); // bind im Konstruktor
}
Button.prototype.click = function () {
console.log(`Button "${this.label}" wurde geklickt`);
};
const b = new Button("Senden");
document.querySelector("button").addEventListener("click", b.click);
Ohne bind()
wäre this.label
im Event-Handler undefined
.
.call()
: Funktion direkt mit this
aufrufen
Mit .call()
rufst du die Funktion sofort auf und setzt dabei this
manuell.
function sayAge(age) {
console.log(`${this.name} ist ${age} Jahre alt`);
}
const person = { name: "Milo" };
sayAge.call(person, 28); // "Milo ist 28 Jahre alt"
Syntax:
func.call(thisArg, arg1, arg2, ...)
.call()
ist besonders nützlich, wenn du eine Funktion direkt aufrufen und gleichzeitig den Kontext festlegen möchtest.
.apply()
: Wie .call()
, aber mit Array als Argument
.apply()
funktioniert genauso wie .call()
, erwartet die Argumente aber in einem Array:
sayAge.apply(person, [32]); // "Milo ist 32 Jahre alt"
Syntax:
func.apply(thisArg, [argsArray])
Das macht .apply()
besonders praktisch, wenn man bereits ein Array mit Argumenten hat – z. B. aus arguments
oder einer anderen Quelle.
Vergleich: Wann bind, call oder apply?
Methode | Funktion bleibt erhalten | Funktion wird sofort ausgeführt | Argumente übergeben |
---|---|---|---|
.bind() | ✅ | ❌ | Direkt oder später |
.call() | ❌ | ✅ | Einzelne Werte |
.apply() | ❌ | ✅ | Als Array |
Beispiel: Methodenrecycling durch call()
Ein typisches Anwendungsszenario für .call()
ist die Wiederverwendung von Methoden:
const admin = {
name: "Lina",
logRole(role) {
console.log(`${this.name} ist ${role}`);
}
};
const guest = { name: "Ben" };
admin.logRole.call(guest, "Gast"); // "Ben ist Gast"
Obwohl logRole
nicht Teil von guest
ist, kann die Methode problemlos mit einem anderen Kontext ausgeführt werden.
Und in Arrow Functions?
Arrow Functions sind nicht kompatibel mit .bind()
, .call()
oder .apply()
– denn sie binden ihr this
lexikalisch. Änderungen am Kontext greifen hier nicht.
const arrow = () => {
console.log(this);
};
arrow.call({ name: "Test" }); // Ignoriert – `this` bleibt window / global object
Deshalb: Verwende bind()
, call()
und apply()
nur bei normalen Funktionen.
Fazit: Methodenbindung meistern heißt this
meistern
Die Methoden .bind()
, .call()
und .apply()
sind Werkzeuge, mit denen du this
in JavaScript gezielt und kontrolliert einsetzen kannst. Damit vermeidest du typische Fehler wie verlorene Kontexte oder unerwartetes Verhalten bei Callbacks und Event-Handlern.
- Nutze
.bind()
, wenn du eine Funktion weiterreichen, aber den Kontext fixieren willst. - Greife zu
.call()
, wenn du eine Funktion sofort mit einem bestimmtenthis
aufrufen willst. - Verwende
.apply()
, wenn deine Argumente in einem Array vorliegen.
Wer diese Methoden beherrscht, schreibt robusteren, flexibleren und besser verständlichen Code – gerade in größeren Projekten oder bei dynamischer Funktionsausführung.
Buy me a coffee
Wenn Dir meine Beiträge gefallen und sie Dir bei Deiner Arbeit helfen, würde ich mich über einen “Kaffee” und ein paar nette Worte von Dir freuen.