Function.caller

Не стандартно: Эта возможность не является стандартной и стандартизировать её пока никто не собирается. Не используйте её на сайтах, смотрящих во внешний мир: она будет работать не у всех пользователей. Также могут присутствовать большие несовместимости между реализациями и её поведение может в будущем измениться.

Сводка

Свойство function.caller возвращает функцию, которая вызвала указанную функцию.

Описание

Если функция f была вызвана из кода самого верхнего уровня, значение f.caller будет равно null, в противном случае значение будет равно функции, вызвавшей f.

Это свойство пришло на замену удалённого свойства arguments.caller объекта arguments.

Специальное свойство __caller__, возвращающее объект активации вызывающей функции и, таким образом, позволяющее восстанавливать стек вызовов, было удалено по соображениям безопасности.

Примечания

Обратите внимание, что в случае рекурсии, вы не сможете воссоздать стек вызовов, используя это свойство. Пусть у нас есть функции:

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

В момент вызова функции stop(), стек вызовов имеет следующий вид:

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

Следующее условие верно:

stop.caller === g && f.caller === g && g.caller === f

так что если вы попытаетесь оттрассировать стек в функции stop() подобным образом:

js
var f = stop;
var stack = "Трассировка стека:";
while (f) {
  stack += "\n" + f.name;
  f = f.caller;
}

то этот цикл никогда не остановится.

Примеры

Пример: проверка значения свойства caller функции

Следующий код проверяет значение свойства caller функции.

js
function myFunc() {
  if (myFunc.caller == null) {
    return "Эта функция была вызвана из верхнего уровня!";
  } else {
    return "Эта функция была вызвана из " + myFunc.caller;
  }
}

Спецификации

Не является частью какой-либо спецификации. Реализована в JavaScript 1.5.

Совместимость с браузерами

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
caller
DeprecatedNon-standard

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
Non-standard. Check cross-browser support before using.
Deprecated. Not for use in new websites.

Смотрите также