Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. JavaScript
  3. JavaScript-Referenz
  4. Funktionen
  5. Das arguments-Objekt
  6. callee

Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.

View in EnglishAlways switch to English

arguments.callee

Veraltet: Diese Funktion wird nicht mehr empfohlen. Obwohl einige Browser sie möglicherweise noch unterstützen, könnte sie bereits aus den relevanten Webstandards entfernt worden sein, in Kürze entfernt werden oder nur noch aus Kompatibilitätsgründen bestehen. Vermeiden Sie die Verwendung und aktualisieren Sie vorhandenen Code, falls möglich; siehe dieKompatibilitätstabelle am Ende dieser Seite, um Ihre Entscheidung zu unterstützen. Beachten Sie, dass diese Funktion jederzeit aufhören könnte zu funktionieren.

Hinweis:Der Zugriff aufarguments.callee imstrict mode führt zu einemTypeError. Wenn eine Funktion sich selbst referenzieren muss, geben Sie entweder demFunktionsausdruck einen Namen oder verwenden Sie eineFunktionsdeklaration.

Diearguments.callee Daten-Eigenschaft enthält die aktuell ausgeführte Funktion, zu der die Argumente gehören.

Wert

Ein Verweis auf die aktuell ausgeführte Funktion.

Eigenschaften vonarguments.callee
Schreibbarja
Aufzählbarnein
Konfigurierbarja

Hinweis:callee ist eine Dateneigenschaft nur in nicht-strikten Funktionen mit einfachen Parametern (in diesem Fall ist dasarguments-Objekt auchautomatisch synchronisierend). Andernfalls ist es eine Accessor-Eigenschaft, deren Getter und Setter beide einenTypeError werfen.

Beschreibung

callee ist eine Eigenschaft desarguments-Objekts. Sie kann innerhalb des Funktionskörpers verwendet werden, um auf die aktuell ausgeführte Funktion zu verweisen. Dies ist nützlich, wenn der Name der Funktion unbekannt ist, wie bei einem Funktionsausdruck ohne Namen (auch als "anonyme Funktionen" bezeichnet).

(Der folgende Text ist weitgehend auseiner Stack Overflow-Antwort von olliej übernommen)

Frühe Versionen von JavaScript erlaubten keine benannten Funktionsausdrücke, und aus diesem Grund konnten Sie keinen rekursiven Funktionsausdruck erstellen.

Zum Beispiel funktionierte diese Syntax:

js
function factorial(n) {  return n <= 1 ? 1 : factorial(n - 1) * n;}[1, 2, 3, 4, 5].map(factorial);

aber:

js
[1, 2, 3, 4, 5].map(function (n) {  return n <= 1 ? 1 : /* what goes here? */ (n - 1) * n;});

nicht. Um dies zu umgehen, wurdearguments.callee hinzugefügt, sodass Sie Folgendes tun konnten:

js
[1, 2, 3, 4, 5].map(function (n) {  return n <= 1 ? 1 : arguments.callee(n - 1) * n;});

Das Design vonarguments.callee weist jedoch mehrere Probleme auf. Das erste Problem ist, dass der rekursive Aufruf einen anderenthis-Wert erhält. Zum Beispiel:

js
function sillyFunction(recursed) {  if (this !== globalThis) {    console.log("This is:", this);  } else {    console.log("This is the global");  }  if (!recursed) {    return arguments.callee(true);  }}sillyFunction();// This is the global// This is: [object Arguments]

Darüber hinaus machen Verweise aufarguments.callee das Inlining und die Endrekursion im Allgemeinen unmöglich. (In bestimmten Fällen können Sie dies durch Nachverfolgung usw. erreichen, aber selbst der beste Code ist aufgrund von Überprüfungen, die sonst nicht notwendig wären, suboptimal.)

ECMAScript 3 hat diese Probleme gelöst, indem benannte Funktionsausdrücke erlaubt wurden. Zum Beispiel:

js
[1, 2, 3, 4, 5].map(function factorial(n) {  return n <= 1 ? 1 : factorial(n - 1) * n;});

Dies hat zahlreiche Vorteile:

  • die Funktion kann wie jede andere innerhalb Ihres Codes aufgerufen werden
  • sie erstellt keine Variable im äußeren Bereich (außer bei IE 8 und darunter)
  • sie hat eine bessere Performance als der Zugriff auf das arguments-Objekt

Der strict mode hat andere Eigenschaften verboten, die Stapelinformationen durchsickern, wie diecaller-Eigenschaft von Funktionen. Dies liegt daran, dass das Betrachten des Aufrufstapels einen einzigen großen Effekt hat: Es macht eine große Anzahl von Optimierungen unmöglich oder viel schwieriger. Zum Beispiel, wenn Sie nicht garantieren können, dass eine Funktionf keine unbekannte Funktion aufruft, ist es nicht möglich,f zu inlineen.

js
function f(a, b, c, d, e) {  return a ? b * c : d * e;}

Wenn der JavaScript-Interpreter nicht garantieren kann, dass alle übergebenen Argumente zum Zeitpunkt des Aufrufs Zahlen sind, muss er entweder Überprüfungen für alle Argumente vor dem inlangenen Code einfügen, oder er kann die Funktion nicht inlinen. Dies bedeutet, dass jede Aufrufstelle, die trivial inlinebar gewesen sein könnte, eine große Anzahl an Wachen ansammelt. In diesem speziellen Fall sollte ein intelligenter Interpreter in der Lage sein, die Überprüfungen optimaler umzuordnen und keine Werte zu überprüfen, die nicht verwendet würden. In vielen Fällen ist dies jedoch einfach nicht möglich, und es wird unmöglich, die Funktion zu inlinen.

Beispiele

Verwendung von arguments.callee in einer anonymen rekursiven Funktion

Eine rekursive Funktion muss in der Lage sein, sich selbst zu referenzieren. Normalerweise referenziert eine Funktion sich selbst über ihren Namen. Eine anonyme Funktion (die durch einenFunktionsausdruck oder denFunction-Konstruktor erstellt werden kann) hat jedoch keinen Namen. Wenn es daher keine zugängliche Variable gibt, die auf sie verweist, istarguments.callee der einzige Weg, über den die Funktion auf sich selbst verweisen kann.

Das folgende Beispiel definiert eine Funktion, die wiederum eine Fakultätsfunktion definiert und zurückgibt. Dieses Beispiel ist nicht sehr praktisch, und es gibt nahezu keine Fälle, in denen dasselbe Ergebnis nicht mitbenannten Funktionsausdrücken erreicht werden kann.

js
function create() {  return function (n) {    if (n <= 1) {      return 1;    }    return n * arguments.callee(n - 1);  };}const result = create()(5); // returns 120 (5 * 4 * 3 * 2 * 1)

Rekursion von anonymen Funktionen mit einem Y-Kombinator

Obwohl Funktionsausdrücke jetzt benannt werden können, bleibenPfeilfunktionen immer anonym, was bedeutet, dass sie nicht auf sich selbst referenzieren können, ohne zuerst einer Variablen zugewiesen zu werden. Glücklicherweise gibt es im Lambda-Kalkül eine sehr gute Lösung, die es einer Funktion ermöglicht, sowohl anonym als auch selbstreferenziell zu sein. Die Technik wird alsY-Kombinator bezeichnet. Hier wird nicht erklärt,wie es funktioniert, sondern nur,dass es funktioniert.

js
// The Y-combinator: a utility function!const Y = (hof) => ((x) => x(x))((x) => hof((y) => x(x)(y)));console.log(  [1, 2, 3, 4, 5].map(    // Wrap the higher-order function in the Y-combinator    // "factorial" is not a function's name: it's introduced as a parameter    Y((factorial) => (n) => (n <= 1 ? 1 : factorial(n - 1) * n)),  ),);// [ 1, 2, 6, 24, 120 ]

Hinweis:Diese Methode allokiert für jede Iteration einen neuen Abschluss, was den Speicherverbrauch erheblich erhöhen kann. Sie wird hier nur demonstriert, um die Möglichkeit aufzuzeigen, sollte jedoch in der Produktion vermieden werden. Verwenden Sie stattdessen eine temporäre Variable oder einen benannten Funktionsausdruck.

Spezifikationen

Specification
ECMAScript® 2026 Language Specification
# sec-arguments-exotic-objects

Browser-Kompatibilität

Siehe auch

Help improve MDN

Learn how to contribute Diese Seite wurde automatisch aus dem Englischen übersetzt.

[8]ページ先頭

©2009-2025 Movatter.jp