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.

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

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