Skip to content

Arrow Functions in JavaScript - Was this hier wirklich bedeutet

Published: at 06:00 AMSuggest Changes

this in Arrow Functions: Die stille Revolution im JavaScript-Kontext

Seit der Einführung von Arrow Functions mit ES6 (ECMAScript 2015) hat sich JavaScript in Bezug auf das this-Verhalten grundlegend verändert. Während in klassischen Funktionen this dynamisch und abhängig vom Aufruf gebunden ist, gelten für Arrow Functions ganz andere Regeln. Sie übernehmen das this des umgebenden Kontexts, ganz gleich, wann oder wie sie aufgerufen werden.

Diese Eigenschaft kann für Entwickler:innen ein großer Vorteil sein, wenn man sie richtig versteht und gezielt einsetzt. Doch sie bringt auch neue Stolpersteine mit sich, besonders wenn man zu schnell in alte Denkmuster zurückfällt.

Lexikalisches this: Der entscheidende Unterschied

Der wohl wichtigste Punkt bei Arrow Functions ist, dass sie kein eigenes this binden. Stattdessen übernehmen sie das this aus dem lexikalischen Kontext, also aus der Umgebung, in der sie definiert wurden, nicht aus der Umgebung, in der sie aufgerufen werden.

Ein klassisches Beispiel:

const user = {
  name: "Nora",
  greet() {
    setTimeout(function () {
      console.log(`Hallo, ich bin ${this.name}`);
    }, 1000);
  }
};

user.greet(); // `this` zeigt auf das globale Objekt oder ist undefined

Hier ist das Problem: Die an setTimeout übergebene Funktion hat ein eigenes this, das beim Aufruf auf das globale Objekt zeigt, nicht auf user.

Die Lösung mit einer Arrow Function:

const user = {
  name: "Nora",
  greet() {
    setTimeout(() => {
      console.log(`Hallo, ich bin ${this.name}`);
    }, 1000);
  }
};

user.greet(); // "Hallo, ich bin Nora"

Da Arrow Functions das this des umgebenden Scopes übernehmen, was in diesem Fall der Methode greet() ist, bleibt der Bezug zu user erhalten.

Kein dynamisches this mehr: Befreiung oder Einschränkung?

Im Gegensatz zu normalen Funktionen haben Arrow Functions kein dynamisches Verhalten, wenn es um this geht. Das bedeutet, dass man es nicht nachträglich mit call, apply oder bind in den Kontext bringen muss.

const arrow = () => {
  console.log(this.name);
};

const person = { name: "Mila" };
arrow.call(person); // `this` bleibt das ursprüngliche – nicht veränderbar

Das ist ein Segen, wenn man sich auf stabilen Kontext verlassen will, aber ein Fluch, wenn man this bewusst steuern möchte.

Arrow Functions in Klassen: Bestens geeignet für Event-Handler

Ein Paradebeispiel für den praktischen Einsatz von Arrow Functions mit festem this-Binding sind Event-Handler in Klassen.

class Button {
  constructor(label) {
    this.label = label;
  }

  handleClick = () => {
    console.log(`Button "${this.label}" wurde geklickt`);
  };
}

Durch die Verwendung einer Arrow Function als Klassen-Eigenschaft ist this automatisch auf die jeweilige Instanz gebunden, ganz ohne bind() im Konstruktor. Das macht Arrow Functions zu einem bevorzugten Werkzeug in modernen UI-Frameworks wie React, Vue (Composition API) oder Svelte.

Achtung bei Methoden: Arrow Functions sind keine Prototypen-Methoden

Ein wichtiger Unterschied zu klassischen Methoden. Arrow Functions landen nicht auf dem Prototypen der Klasse, sondern direkt auf jeder Instanz.

class User {
  #name;

  constructor(name) {
    this.name = name;
  }

  greet = () => {
    console.log(`Hallo, ich bin ${this.name}`);
  };
}

Das bedeutet, dass für jede Instanz die Arrow Function neu erstellt wird, was zu mehr Speicherverbrauch führen kann, wenn viele Instanzen erzeugt werden. Für Utility-Methoden mit häufigem Aufruf wäre eine Arrow Function dann die falsche Wahl.

Hier stellt sich dann auch die Frage, ob in Bezug auf stringenten Code und bessere Lesbarkeit komplett auf die Benutzung von Arrow Functions verzichtet werden und stattdessen die Möglichkeit der “.bind()” Methode im Konstruktor verwendet werden sollte.

Arrow Functions in Callbacks: Eine elegante Lösung für this

In vielen klassischen Callbacks, zum Beispiel bei Array-Methoden wie .map() oder .forEach(), kann die Verwendung von Arrow Functions das lästige Binden von this überflüssig machen.

const team = {
  name: "Entwicklung",
  members: ["Lia", "Tom", "Nico"],
  list() {
    this.members.forEach(member => {
      console.log(`${member} ist Teil des Teams ${this.name}`);
    });
  }
};

team.list();
// Lia ist Teil des Teams Entwicklung
// Tom ist Teil des Teams Entwicklung
// Nico ist Teil des Teams Entwicklung

Mit einer normalen Funktion im Callback müsste man das this manuell mit bind(this) setzen oder vorher zwischenspeichern (that = this).

Kein this, kein arguments, kein super

Arrow Functions sind leichtgewichtig und verzichten dabei auf eigene Bindungen für einige Kernkonzepte. Neben this betrifft das auch:

Das macht sie weniger geeignet für komplexe Methodenlogik, aber ideal für einfache, kontextstabile Aufgaben.

Fazit: Arrow Functions – Kontextbewusst statt kontextflexibel

Arrow Functions sind ein mächtiges Werkzeug, um das oft verwirrende Verhalten von this in JavaScript überschaubar und sicher zu gestalten. Indem sie auf das this ihrer Umgebung zugreifen, machen sie den Code weniger fehleranfällig, besonders in asynchronen Operationen oder im Umgang mit UI-Events.

Aber Arrow Functions ersetzen nicht alle Einsatzzwecke klassischer Funktionen. Wer this, arguments oder super aktiv benötigt, sollte weiterhin normale Funktionen verwenden.

Richtig eingesetzt sind Arrow Functions eine Bereicherung für jede:n Entwickler:in. Besonders in Kombination mit modernen Klassen, React-Komponenten oder funktionalem Code.


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.

Buy me a coffee



Previous Post
Einführung in Daten & Algorithmen – Von den Anfängen der EDV bis hin zu Big Data und den Large Language Modellen in der KI
Next Post
JavaScript-Klassen verstehen - Wie funktioniert this in Klassen wirklich?