Не стандартно
Эта возможность не является стандартной и стандартизировать её пока никто не собирается. Не используйте её на сайтах, смотрящих во внешний мир: она будет работать не у всех пользователей. Также могут присутствовать большие несовместимости между реализациями и её поведение может в будущем измениться.
Сводка
Свойство function.caller
возвращает функцию, которая вызвала указанную функцию.
Описание
Если функция f
была вызвана из кода самого верхнего уровня, значение f.caller
будет равно null
, в противном случае значение будет равно функции, вызвавшей f
.
Это свойство пришло на замену удалённого свойства arguments.caller
объекта arguments
.
Специальное свойство __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()
подобным образом:
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.
Совместимость с браузерами
Возможность | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Базовая поддержка | (Да) | 1.0 (1.7 или ранее) | (Да) | (Да) | (Да) |
Возможность | Android | Chrome для Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Базовая поддержка | (Да) | (Да) | 1.0 (1.0) | (Да) | (Да) | (Да) |
Смотрите также
- Ошибка реализации в SpiderMonkey: ошибка 65683