Function.caller
Не стандартно: Эта возможность не является стандартной и стандартизировать её пока никто не собирается. Не используйте её на сайтах, смотрящих во внешний мир: она будет работать не у всех пользователей. Также могут присутствовать большие несовместимости между реализациями и её поведение может в будущем измениться.
Сводка
Свойство 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(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.
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
- Ошибка реализации в SpiderMonkey: Firefox bug 65683