--- title: Function.caller slug: Web/JavaScript/Reference/Global_Objects/Function/caller tags: - Function - JavaScript - Non-standard - Property translation_of: Web/JavaScript/Reference/Global_Objects/Function/caller ---
{{JSRef("Global_Objects", "Function")}} {{non-standard_header}}

Сводка

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

Описание

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

Это свойство пришло на замену удалённого свойства {{jsxref("Functions_and_function_scope/arguments/caller", "arguments.caller")}} объекта {{jsxref("Functions_and_function_scope/arguments", "arguments")}}.

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

Примечания

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

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() подобным образом:

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

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

Примеры

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

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

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

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

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

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

{{Compat}}

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