Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. JavaScript
  3. JavaScript-Referenz
  4. Eingebaute Standardobjekte
  5. Function
  6. caller

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

View in EnglishAlways switch to English

Function.prototype.caller

Nicht standardisiert: Diese Funktion ist nicht standardisiert. Wir raten davon ab, nicht-standardisierte Funktionen auf produktiven Webseiten zu verwenden, da sie nur von bestimmten Browsern unterstützt werden und sich in Zukunft ändern oder entfernt werden können. Unter Umständen kann sie jedoch eine geeignete Option sein, wenn es keine standardisierte Alternative gibt.

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:ImStrict-Modus führt der Zugriff aufcaller einer Funktion zu einem Fehler – die API wurde ohne Ersatz entfernt. Dies soll verhindern, dass Code den Stack "durchlaufen" kann, was sowohl Sicherheitsrisiken darstellt als auch die Möglichkeit von Optimierungen wie Inlining und Tail-Call-Optimierung stark einschränkt. Für eine ausführlichere Erklärung können Siedie Begründung für die Abschaffung vonarguments.callee lesen.

Diecaller-Accessor-Eigenschaft vonFunction-Instanzen gibt die Funktion zurück, die diese Funktion aufgerufen hat. FürStrict, Arrow-, Async- und Generatorfunktionen führt der Zugriff auf diecaller-Eigenschaft zu einemTypeError.

Beschreibung

Wenn die Funktionf durch den Code auf oberster Ebene aufgerufen wurde, ist der Wert vonf.callernull; andernfalls ist es die Funktion, dief aufgerufen hat. Wenn die Funktion, dief aufgerufen hat, eine Strict-Modus-Funktion ist, ist der Wert vonf.caller ebenfallsnull.

Beachten Sie, dass das einzige Verhalten, das durch die ECMAScript-Spezifikation festgelegt ist, darin besteht, dassFunction.prototype einen anfänglichencaller-Accessor besitzt, der bedingungslos einenTypeError für jedeget- oderset-Anfrage auslöst (bekannt als "Giftpillen-Accessor"), und dass Implementierungen nicht berechtigt sind, diese Semantik für irgendeine Funktion zu ändern, mit Ausnahme von nicht-strikten normalen Funktionen, in welchem Fall sie nicht den Wert einer Strict-Modus-Funktion haben darf. Das tatsächliche Verhalten dercaller-Eigenschaft, wenn es etwas anderes als das Auslösen eines Fehlers ist, ist implementierungsabhängig. Zum Beispiel definiert Chrome es als eine eigene Dateneigenschaft, während Firefox und Safari den anfänglichen Giftpillen-Function.prototype.caller-Accessor erweitern, um speziell mitthis-Werten umzugehen, die nicht-strikte Funktionen sind.

js
(function f() {  if (Object.hasOwn(f, "caller")) {    console.log(      "caller is an own property with descriptor",      Object.getOwnPropertyDescriptor(f, "caller"),    );  } else {    console.log(      "f doesn't have an own property named caller. Trying to get f.[[Prototype]].caller",    );    console.log(      Object.getOwnPropertyDescriptor(        Object.getPrototypeOf(f),        "caller",      ).get.call(f),    );  }})();// In Chrome:// caller is an own property with descriptor {value: null, writable: false, enumerable: false, configurable: false}// In Firefox:// f doesn't have an own property named caller. Trying to get f.[[Prototype]].caller// null

Diese Eigenschaft ersetzt die veraltetearguments.caller-Eigenschaft desarguments-Objekts.

Die spezielle Eigenschaft__caller__, die das Aktivierungsobjekt des Callers zurückgab und somit die Rekonstruktion des Stacks ermöglichte, wurde aus Sicherheitsgründen entfernt.

Beispiele

Überprüfung des Wertes dercaller-Eigenschaft einer Funktion

Der folgende Code überprüft den Wert dercaller-Eigenschaft einer Funktion.

js
function myFunc() {  if (myFunc.caller === null) {    return "The function was called from the top!";  }  return `This function's caller was ${myFunc.caller}`;}

Rekonstruktion des Stacks und Rekursion

Beachten Sie, dass im Falle einer Rekursion der Aufruf-Stack mit dieser Eigenschaft nicht rekonstruiert werden kann. Betrachten Sie:

js
function f(n) {  g(n - 1);}function g(n) {  if (n > 0) {    f(n);  } else {    stop();  }}f(2);

In dem Moment, in demstop() aufgerufen wird, sieht der Aufruf-Stack folgendermaßen aus:

f(2) -> g(1) -> f(1) -> g(0) -> stop()

Folgendes trifft zu:

js
stop.caller === g && f.caller === g && g.caller === f;

Wenn Sie also versuchen würden, den Stack-Trace in derstop()-Funktion wie folgt zu erhalten:

js
let f = stop;let stack = "Stack trace:";while (f) {  stack += `\n${f.name}`;  f = f.caller;}

würde die Schleife nie enden.

Strict-Modus-Caller

Wenn der Caller eine Strict-Modus-Funktion ist, ist der Wert voncallernull.

js
function callerFunc() {  calleeFunc();}function strictCallerFunc() {  "use strict";  calleeFunc();}function calleeFunc() {  console.log(calleeFunc.caller);}(function () {  callerFunc();})();// Logs [Function: callerFunc](function () {  strictCallerFunc();})();// Logs null

Spezifikationen

Nicht Teil eines Standards.

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