2011-11-21 10 views
8

nazywając Mam funkcji w JS, który jest uzyskiwanie nazwie z wielu miejsc ..Javascript znaleźć funkcję

Teraz jestem testowania tej strony na iPadzie, a tym samym znaleźć debugowania nieco trudne.

Czy mogę się w jakiś sposób dowiedzieć (wydrukować na konsoli) skąd wywoływana jest moja funkcja?

+2

Pomoże: http://stackoverflow.com/questions/280389/how-to-you-find-out-the-caller-function-in-javascript – Sid

+0

Jeszcze jeden link http://stackoverflow.com/questions/147891/javascript-exception-stack-trace –

Odpowiedz

13

Podoba Ci się to?

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

Jeśli używasz 'use strict'; w pliku JavaScript, trzeba komentować/usuń go, bo inaczej dostaniesz coś takiego:

Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them

+3

Dostaję błąd lub .... Wynik wyrażenia arguments.callee.caller nie jest obiektem – testndtv

+0

Sprawdzam to na iPadzie Safari..Jeśli to ma znaczenie ... – testndtv

+0

@ James, +1, Twoja funkcja zaoszczędziła mi czas, aby zrozumieć istniejące ramy i zakończyć moją pracę. Wielkie dzięki!!! –

9

Prostym sposobem Lubię używać jest arguments.callee.caller.name .

Powiedzmy, że chciał wiedzieć, co było wywołanie funkcji o nazwie myFunction:

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

Wsparcie przeglądarka za to nie jest wielki, choć, więc można użyć arguments.callee.caller.toString() zamiast. Zwróć uwagę, że w ten sposób otrzymasz zawartość funkcji o nazwie myFunction, więc musisz samodzielnie wydobyć nazwę funkcji.

Albo można użyć piękny funkcję śledzenia stosu tak:

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; 
} 

ślad stosu poprzez http://www.amirharel.com/2010/01/25/using-caller-and-callee-for-stack-trace/

0

Chcesz Szczegółowo o rozmówcy Funkcja:

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

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

W miejsce z arguments.callee.caller.toString() możemy również użyć functionName.caller

przykład:

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

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

wyjściowa: będą takie same w obu wyżej przypadku

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

* functionName.caller * jest niezły, ale [niestandardowy] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller) (zgodnie z MDN) – mTorres

Powiązane problemy