Start · Sprachen · JavaScript · Referenz · arguments.callee

arguments.callee

Eigenschaft

Die Dateneigenschaft <code>arguments.callee</code> verweist auf die gerade ausgeführte Funktion, zu der das <code>arguments</code>-Objekt gehört.

seit JavaScript ES1 (im Strict Mode seit ES5 verboten, veraltet) deprecated seit ja Kategorie: method-property

Signatur

arguments.callee

Beschreibung

arguments.callee ist eine Eigenschaft des arguments-Objekts, das in jeder normalen (nicht Pfeil-)Funktion zur Verfügung steht. Sie enthält eine Referenz auf die Funktion selbst. So kann sich eine Funktion selbst aufrufen, auch wenn sie keinen Namen hat.

Früher war das vor allem bei anonymen Funktionsausdrücken wichtig, etwa bei rekursiven Callbacks für setTimeout oder Array.prototype.map. Seit ES3 gibt es aber benannte Funktionsausdrücke (function fak(n) { … }). Deren Name ist nur innerhalb der Funktion sichtbar und löst dieses Problem sauberer.

Im Strict Mode ("use strict", ES-Module, Klassenkörper) löst schon das Lesen von arguments.callee einen TypeError aus. Das gilt auch für Funktionen mit Rest-Parametern, Standardwerten oder Destrukturierung in der Parameterliste: Deren arguments-Objekt ist immer „unmapped“, und callee ist dort ein Accessor, der einen Fehler wirft. In neuem Code sollte man die Eigenschaft deshalb nicht mehr verwenden.

Rückgabewert

Typ
Function
Beschreibung
Die gerade ausgeführte Funktion, zu der das arguments-Objekt gehört. Im Strict Mode wird kein Wert zurückgegeben, sondern ein TypeError ausgelöst.

Beispiele

Rekursion in einer anonymen Funktion (Sloppy Mode)

// Nur außerhalb des Strict Mode lauffähig
const ergebnisse = [1, 2, 3, 4, 5].map(function (n) {
  return n <= 1 ? 1 : n * arguments.callee(n - 1);
});

console.log(ergebnisse);
[1, 2, 6, 24, 120]

Moderne Alternative: benannter Funktionsausdruck

'use strict';

// Der Name 'fak' ist nur innerhalb der Funktion sichtbar
const ergebnisse = [1, 2, 3, 4, 5].map(function fak(n) {
  return n <= 1 ? 1 : n * fak(n - 1);
});

console.log(ergebnisse);
[1, 2, 6, 24, 120]

TypeError im Strict Mode

'use strict';

function test() {
  try {
    return arguments.callee;
  } catch (err) {
    return `${err.name}: Zugriff verboten`;
  }
}

console.log(test());
TypeError: Zugriff verboten

Wiederholtes Polling mit setTimeout ohne callee

let versuche = 0;

// Benannter Funktionsausdruck statt arguments.callee
setTimeout(function poll() {
  versuche++;
  console.log(`Versuch ${versuche}`);
  if (versuche < 3) setTimeout(poll, 100);
}, 100);
Versuch 1 Versuch 2 Versuch 3

// Wichtig · Fallstricke

  • Veraltet: Im Strict Mode, in ES-Modulen und in Klassen löst jeder Zugriff einen TypeError aus. Nutzen Sie stattdessen benannte Funktionsausdrücke oder Funktionsdeklarationen.
  • Auch außerhalb des Strict Mode wirft der Zugriff einen Fehler, wenn die Funktion Rest-Parameter, Standardwerte oder Destrukturierung in der Parameterliste verwendet.
  • Pfeilfunktionen haben kein eigenes arguments. Dort bezieht sich arguments.callee auf die umgebende normale Funktion oder führt zu einem ReferenceError.
  • Performance: Der Zugriff auf arguments.callee kann Engine-Optimierungen wie Inlining und Tail Calls verhindern.
  • callee ist eine eigene, nicht aufzählbare Eigenschaft von arguments. Sie taucht also nicht in for…in-Schleifen oder bei Object.keys auf.
  • Die ähnliche Eigenschaft arguments.caller wurde komplett entfernt. Function.prototype.caller ist nicht standardisiert.
  • Browser-Kompatibilität: Alle Browser und Node.js unterstützen die Eigenschaft im Sloppy Mode. Sie gilt aber als Altlast.