function main()
{
Hello();
}
function Hello()
{
// How do you find out the caller function is 'main'?
}
Czy istnieje sposób na sprawdzenie stosu wywołań?
javascript
callstack
Ray Lu
źródło
źródło
Odpowiedzi:
Pamiętaj, że ta funkcja jest niestandardowa , ponieważ
Function.caller
:Poniżej znajduje się stara odpowiedź z 2008 roku, która nie jest już obsługiwana w nowoczesnym JavaScript:
źródło
arguments.callee.caller.name
otrzyma nazwę funkcji.'use strict';
może pomóc.arguments
Można uzyskać do niego dostęp z funkcji w trybie ścisłym, głupotą byłoby przestać to robić. po prostu nie z function.arguments z zewnątrz. Ponadto, jeśli masz nazwany argument, jego forma argumentów [i] nie będzie śledzić zmian, które wprowadzasz w nazwanej wersji wewnątrz funkcji.Ślad stosu
Cały ślad stosu można znaleźć za pomocą kodu specyficznego dla przeglądarki. Dobrą rzeczą jest to, że ktoś już to zrobił ; oto kod projektu na GitHub .
Ale nie wszystkie wiadomości są dobre:
Śledzenie stosu jest bardzo powolne, więc bądź ostrożny (przeczytaj to więcej).
Musisz zdefiniować nazwy funkcji, aby ślad stosu był czytelny. Ponieważ jeśli masz taki kod:
Google Chrome ostrzega,
... kls.Hello ( ...
ale większość przeglądarek oczekuje nazwy funkcji tuż po słowie kluczowymfunction
i traktuje ją jako funkcję anonimową. Nawet Chrome nie będzie mógł użyć tejKlass
nazwy, jeśli nie podaszkls
jej funkcji.Nawiasem mówiąc, możesz przejść do funkcji printStackTrace opcję,
{guess: true}
ale nie znalazłem żadnej prawdziwej poprawy.Nie wszystkie przeglądarki podają te same informacje. To znaczy parametry, kolumna kodu itp.
Nazwa funkcji dzwoniącego
Nawiasem mówiąc, jeśli chcesz tylko nazwę funkcji wywołującej (w większości przeglądarek, ale nie IE), możesz użyć:
Pamiętaj jednak, że ta nazwa będzie następować po
function
słowie kluczowym. Nie znalazłem sposobu (nawet w Google Chrome), aby uzyskać więcej bez uzyskania kodu całej funkcji.Kod funkcji dzwoniącego
I podsumowując pozostałe najlepsze odpowiedzi (autor: Pablo Cabrera, Nourdine i Greg Hewgill). Jedyną i naprawdę bezpieczną rzeczą, jakiej można używać w różnych przeglądarkach, jest:
Który pokaże kod funkcji dzwoniącego. Niestety, to mi nie wystarcza i dlatego udzielam wskazówek dotyczących StackTrace i nazwy funkcji wywołującej (chociaż nie są one obsługiwane przez różne przeglądarki).
źródło
Function.caller
za @ odpowiedź GregaFunction.caller
nie będzie jednak działać w trybie ścisłym.Wiem, że wspomniałeś o „w Javascript”, ale jeśli celem jest debugowanie, myślę, że łatwiej jest po prostu użyć narzędzi programistycznych przeglądarki. Tak to wygląda w Chrome: Po prostu upuść debugger w miejscu, w którym chcesz sprawdzić stos.
źródło
Podsumowując (i czyniąc to jaśniejszym) ...
ten kod:
jest równoważne z tym:
Oczywiście pierwszy bit jest bardziej przenośny, ponieważ możesz zmienić nazwę funkcji, powiedz z „Hello” na „Ciao”, i nadal wszystko działa.
W tym ostatnim przypadku, jeśli zdecydujesz się na refaktoryzację nazwy wywoływanej funkcji (Hello), będziesz musiał zmienić wszystkie jej wystąpienia :(
źródło
Możesz uzyskać pełny stacktrace:
Dopóki dzwoniący nie jest
null
.Uwaga: powoduje nieskończoną pętlę funkcji rekurencyjnych.
źródło
Zwykle używam
(new Error()).stack
w Chrome. Zaletą jest to, że daje to również numery linii, w których dzwoniący wywołał funkcję. Minusem jest to, że ogranicza długość stosu do 10, dlatego przede wszystkim trafiłem na tę stronę.(Używam tego do zbierania stosów wywołań w konstruktorze niskiego poziomu podczas wykonywania, do przeglądania i debugowania później, więc ustawienie punktu przerwania nie jest przydatne, ponieważ zostanie uderzony tysiące razy)
źródło
'use strict';
jest na miejscu. Podaj mi informacje, których potrzebowałem - dzięki!Jeśli nie zamierzasz go uruchamiać w IE <11, to powinna pasować console.trace () .
źródło
Możesz użyć Function.Caller, aby uzyskać funkcję wywoływania. Stara metoda wykorzystująca argument.caller jest uważana za przestarzałą.
Poniższy kod ilustruje jego użycie:
Uwagi na temat przestarzałego argumentu. Caller: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/caller
Pamiętaj, Function.caller jest niestandardowy: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/caller
źródło
Cannot access caller property of a strict mode function
Zrobiłbym to:
źródło
źródło
arguments.callee.caller.toString()
Jest bezpieczniejszy w użyciu,
*arguments.callee.caller
ponieważarguments.caller
jest przestarzały ...źródło
arguments.callee
jest również przestarzałe w ES5 i usuwane w trybie ścisłym.arguments.callee
było złym rozwiązaniem problemu, który został teraz lepiej rozwiązany developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Wygląda na to, że jest to dość rozwiązane pytanie, ale niedawno odkryłem, że callee nie jest dozwolony w „trybie ścisłym”, więc dla własnego użytku napisałem klasę, która dostanie ścieżkę od miejsca, w którym się nazywa. Jest to część małej biblioteki pomocnika i jeśli chcesz użyć samodzielnego kodu, zmień przesunięcie użyte do zwrócenia śladu stosu programu wywołującego (użyj 1 zamiast 2)
źródło
function a(){ function b(){ function c(){ return ScriptPath(); } return c(); } return b(); } a()
w konsoli (nie próbowałem w pliku), ale wydaje się mieć rozsądny pomysł. Powinien być mimo to oceniany za widoczność.Spróbuj uzyskać dostęp do tego:
źródło
Wystarczy, że konsola zarejestruje stos błędów. Możesz wtedy wiedzieć, jak się nazywasz
źródło
Aktualizacja 2018
caller
jest zabronione w trybie ścisłym . Oto alternatywa przy użyciu (niestandardowego)Error
stosu .Poniższa funkcja wydaje się wykonywać tę pracę w Firefoksie 52 i Chrome 61-71, chociaż jej implementacja zawiera wiele założeń dotyczących formatu rejestrowania dwóch przeglądarek i powinna być używana ostrożnie, biorąc pod uwagę, że zgłasza wyjątek i prawdopodobnie wykonuje dwa wyrażenia regularne dopasowania przed zakończeniem.
źródło
Zarówno w trybie ES6, jak i ścisłym, skorzystaj z poniższych poleceń, aby uzyskać funkcję dzwoniącego
Należy pamiętać, że powyższa linia wyrzuci wyjątek, jeśli nie ma dzwoniącego lub poprzedni stos. Użyj odpowiednio.
źródło
console.log((new Error()).stack.split("\n")[1].trim().split(" ")[1])
Chciałem dodać tutaj moje skrzypce:
http://jsfiddle.net/bladnman/EhUm3/
Testowałem to Chrome, Safari i IE (10 i 8). Działa w porządku. Liczy się tylko jedna funkcja, więc jeśli przestraszy Cię wielkie skrzypce, przeczytaj poniżej.
Uwaga: W tym skrzypce jest sporo mojej własnej „płyty kotłowej”. Możesz to wszystko usunąć i użyć splitów, jeśli chcesz. To po prostu bardzo bezpieczny „zestaw funkcji, na których polegam.
Jest tam również szablon „JSFiddle”, którego używam do wielu skrzypiec, aby po prostu szybko skrzypać.
źródło
String.prototype.trim = trim;
Jeśli potrzebujesz tylko nazwy funkcji, a nie kodu i chcesz rozwiązania niezależnego od przeglądarki, skorzystaj z następujących opcji:
Zauważ, że powyższe zwróci błąd, jeśli nie ma funkcji wywołującej, ponieważ w tablicy nie ma elementu [1]. Aby obejść ten problem, skorzystaj z poniższych:
źródło
Po prostu chcę poinformować, że w dniu PhoneGap / Android
name
robi wydaje się działać. Alearguments.callee.caller.toString()
załatwi sprawę.źródło
Tutaj wszystko z wyjątkiem
functionname
jest usuwanecaller.toString()
z RegExp.źródło
oto funkcja pozwalająca uzyskać pełny stacktrace :
źródło
W odpowiedziach heystewart i JiarongWu wspomniano, że
Error
obiekt ma dostęp dostack
.Oto przykład:
Różne przeglądarki pokazują stos w różnych formatach łańcuchów:
Safari : Caller is: main@https://stacksnippets.net/js:14:8 Firefox : Caller is: main@https://stacksnippets.net/js:14:3 Chrome : Caller is: at main (https://stacksnippets.net/js:14:3) IE Edge : Caller is: at main (https://stacksnippets.net/js:14:3) IE : Caller is: at main (https://stacksnippets.net/js:14:3)
Większość przeglądarek ustawi stos
var stack = (new Error()).stack
. W Internet Explorerze stos będzie niezdefiniowany - musisz pobrać prawdziwy wyjątek, aby odzyskać stos.Wnioski: Jest możliwe określenie „główny” to dzwoniący do „Hello” używając
stack
wError
obiekcie. W rzeczywistości zadziała w przypadkach, w których podejściecallee
/caller
nie działa. Pokaże także kontekst, tzn. Plik źródłowy i numer linii. Konieczne są jednak starania, aby rozwiązanie było wieloplatformowe.źródło
Zauważ, że nie możesz używać Function.caller w Node.js, zamiast tego użyj pakietu identyfikatora rozmówcy . Na przykład:
źródło
Wypróbuj następujący kod:
Pracował dla mnie w Firefox-21 i Chromium-25.
źródło
arguments.callee
jest przestarzałe od wielu lat .Innym sposobem obejścia tego problemu jest po prostu przekazanie nazwy funkcji wywołującej jako parametru.
Na przykład:
Teraz możesz wywołać funkcję w ten sposób:
Mój przykład wykorzystuje zakodowane sprawdzenie nazwy funkcji, ale możesz łatwo użyć instrukcji switch lub innej logiki, aby zrobić to, co chcesz.
źródło
O ile mi wiadomo, mamy na to dwa sposoby z danych źródeł takich jak ten-
arguments.caller
Function.caller
Myślę, że masz odpowiedź :).
źródło
Dlaczego wszystkie powyższe rozwiązania wyglądają jak rakieta. Tymczasem nie powinien być bardziej skomplikowany niż ten fragment. Wszystkie kredyty dla tego faceta
Jak znaleźć funkcję dzwoniącego w JavaScript?
źródło
Próbuję odpowiedzieć zarówno na pytanie, jak i na obecną nagrodę za pomocą tego pytania.
Nagroda wymaga, aby osoba dzwoniąca została uzyskana w trybie ścisłym , a jedynym sposobem, w jaki mogę to zrobić, jest odwołanie się do funkcji zadeklarowanej poza trybem ścisłym.
Na przykład poniższe elementy są niestandardowe, ale zostały przetestowane z wcześniejszymi (29.03.2016) i aktualnymi (1 sierpnia 2018) wersjami Chrome, Edge i Firefox.
źródło
Jeśli naprawdę potrzebujesz tej funkcji z jakiegoś powodu i chcesz, aby była kompatybilna z różnymi przeglądarkami i nie martwiła się o surowe rzeczy i była kompatybilna z przekazywaniem, to przekaż następujące odniesienie:
źródło
Myślę, że następujący fragment kodu może być pomocny:
Wykonaj kod:
Dziennik wygląda następująco:
źródło