Spec-Zone.ru › JavaScript

Function.prototype.caller

Базовая доступность ограничена

Эта функция не является базовой, поскольку она не работает в некоторых из наиболее широко используемых браузеров.

Устарело: Эта функция больше не рекомендуется. Хотя некоторые браузеры могут все еще поддерживать ее, она, возможно, уже была удалена из соответствующих веб-стандартов, находится в процессе удаления или сохранена только для целей совместимости. Избегайте ее использования и обновите существующий код, если это возможно; см. таблицу совместимости в нижней части этой страницы, чтобы принять решение. Имейте в виду, что эта функция может перестать работать в любое время.

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

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

Примечание: В строгом режиме доступ к caller функции вызывает ошибку — API удалено без замены. Это сделано для того, чтобы предотвратить возможность кода "проходить по стеку", что создает риски безопасности и сильно ограничивает возможности оптимизации, таких как встраивание (inlining) и оптимизация хвостового вызова (tail-call optimization). Для получения дополнительного объяснения вы можете прочитать обоснование устаревания arguments.callee.

Свойство-аксессор caller экземпляров Function возвращает функцию, которая вызвала эту функцию. Для строгих, стрелочных, асинхронных и генераторных функций доступ к свойству caller вызывает TypeError.

Описание

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

Обратите внимание, что единственное поведение, указанное в спецификации ECMAScript, заключается в том, что Function.prototype имеет начальный аксессор caller, который безусловно вызывает TypeError при любом запросе get или set (известный как "аксессор-отравленная пилюля"), и что реализациям не разрешается изменять эту семантику для любых функций, кроме нестрогих обычных функций, и в этом случае он не должен иметь значения функции строгого режима. Фактическое поведение свойства caller, если оно отличается от генерации ошибки, определяется реализацией. Например, Chrome определяет его как собственное свойство данных, в то время как Firefox и Safari расширяют начальный аксессор Function.prototype.caller "отравленной пилюли", чтобы специально обрабатывать значения this, которые являются нестрогими функциями.

(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

Это свойство заменяет устаревшее свойство arguments.caller объекта arguments.

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

Примеры

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

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

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

Восстановление стека и рекурсия

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

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

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

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

Верно следующее:

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

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

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

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

Вызывающая сторона в строгом режиме

Если вызывающая сторона является функцией строгого режима, значение caller равно null.

function callerFunc() {
  calleeFunc();
}

function strictCallerFunc() {
  "use strict";
  calleeFunc();
}

function calleeFunc() {
  console.log(calleeFunc.caller);
}

(function () {
  callerFunc();
})();
// Logs [Function: callerFunc]

(function () {
  strictCallerFunc();
})();
// Logs null

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

Не является частью какого-либо стандарта.

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

Десктоп Мобильные Сервер
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
caller
1
12
1
9.6
3
18
4
10.1
1
1.0
4.4
1
1.0.0
1.0
0.10.0

См. также

  • Function.prototype.name
  • arguments

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API