Как найти вызывающую функцию в JavaScript?

У меня есть функция в JS, которая вызывается из нескольких мест.

Теперь я тестирую эту страницу на iPad и, следовательно, немного отлаживаю отладки.

Можно ли каким-то образом узнать (напечатать на консоли), откуда вызывается моя функция?

Ответ 1

Как это?

function testOne() {
    console.log("Test 1");
    logTest();
}
function testTwo() {
    console.log("Test 2");
    logTest();
}
function logTest() {
    console.log("Being called from " + arguments.callee.caller.toString());
}

testOne();
testTwo();

Если вы используете 'use strict'; в своем файле JavaScript, вам нужно его прокомментировать/удалить, потому что в противном случае вы получите что-то вроде этого:

Невозможно использовать TypeError: свойства "вызывающий", "вызываемый" и "аргументы" могут быть недоступны для функций строгого режима или объектов аргументов для их вызовов

Ответ 2

Простым способом, который я хотел бы использовать, является arguments.callee.caller.name.

Скажите, что вы хотели знать, что вызывало функцию myFunction:

function myFunction() {
    console.log(arguments.callee.caller.name);
    /* Other stuff... */
}

Поддержка браузера для этого не так уж велика, поэтому вместо этого вы можете использовать arguments.callee.caller.toString(). Обратите внимание, что это вернет вам содержимое функции, которая называется myFunction, поэтому вам нужно будет выкопировать имя функции из этого.

Или вы можете использовать хорошую функцию отслеживания стека, например:

function getStack(){
    fnRE  = /function\s*([\w\-$]+)?\s*\(/i;
    var caller = arguments.callee.caller;
    var stack = "Stack = ";
    var fn;
    while (caller){
        fn = fnRE.test(caller.toString()) ? RegExp.$1 || "{?}" : "{?}";
        stack += "-->"+fn;
        caller = caller.arguments.callee.caller;
    };
    return stack;
}

Трассировка стека через http://www.amirharel.com/2010/01/25/using-caller-and-callee-for-stack-trace/

Ответ 3

Хотите подробно рассказать о функции вызывающего абонента:

function nishant(){  // Caller function 
   kumar();
}nishant();

function kumar(){ // Callee
 console.log("This functiona is being called by " + arguments.callee.caller.toString());
}  

Вместо arguments.callee.caller.toString() мы также можем использовать functionName.caller

Пример:

function nishant(){  // Caller function 
   kumar();
}nishant();

function kumar(){ // Callee
 console.log("This functiona is being called by " + kumar.caller);
}  

Выход: будет одинаковым в обоих случаях выше.

This functiona is being called by function nishant()
{
kumar();
}

Ответ 4

Не используйте function.caller, он нестандартный и не рекомендуется.

Вместо этого используйте консоль браузера и поставьте точки останова в своей функции, проверьте стек вызовов. Вот снимок экрана консоли отладчика Chrome

enter image description here