Thanks to visit codestin.com
Credit goes to developer.mozilla.org

This page was translated from English by the community. Learn more and join the MDN Web Docs community.

View in English Always switch to English

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.

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

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