Как я могу найти вызывающую функцию в JavaScript? - PullRequest
10 голосов
/ 21 ноября 2011

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

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

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

Ответы [ 3 ]

15 голосов
/ 21 ноября 2011

Как это?

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, вам нужно его закомментировать / удалить, потому что в противном случае вы получите что-то вроде этого:

Uncaught TypeError: свойства 'caller', 'callee' и 'arguments' не могут быть доступны для функций строгого режима или объектов аргументов для их вызова

11 голосов
/ 21 ноября 2011

Мне нравится использовать простой способ: 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/

0 голосов
/ 03 января 2014

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

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();
}
...