Czy można to zrobić:
myfile.js:
function foo() {
alert(<my-function-name>);
// pops-up "foo"
// or even better: "myfile.js : foo"
}
Mam w swoim stosie frameworki Dojo i jQuery, więc jeśli któreś z nich ułatwią, są dostępne.
javascript
jquery
dojo
sprugman
źródło
źródło
arguments.callee
nie jest dozwolone w trybie ścisłym.Dla funkcji nieanonimowych
Ale w przypadku procedury obsługi błędów wynikiem będzie nazwa funkcji obsługi błędów, prawda?
źródło
Wszystko, czego potrzebujesz, jest proste. Utwórz funkcję:
Następnie, gdy tylko potrzebujesz, po prostu użyj:
źródło
function getFuncName() { return getFuncName.name }
getFuncName
zamiast nazwy osoby dzwoniącej.Według MDN
Jak wspomniano, dotyczy to tylko sytuacji, gdy skrypt używa „trybu ścisłego”. Wynika to głównie ze względów bezpieczeństwa i niestety obecnie nie ma na to alternatywy.
źródło
To powinno to zrobić:
Dla dzwoniącego wystarczy użyć
caller.toString()
.źródło
[
To musi należeć do kategorii „najbrzydszych hacków na świecie”, ale proszę bardzo.
Po pierwsze, wydrukowanie nazwy bieżącej funkcji (jak w innych odpowiedziach) wydaje się mieć dla mnie ograniczone zastosowanie, ponieważ już wiesz, co to jest funkcja!
Jednak znalezienie nazwy funkcji wywołującej może być bardzo przydatne dla funkcji śledzenia. Jest to z wyrażeniem regularnym, ale użycie indexOf byłoby około 3 razy szybsze:
źródło
Oto sposób, który zadziała:
Następnie w twoich testach:
Zauważ, że trzeci test będzie działał tylko wtedy, gdy będzie on zlokalizowany w / util / functions
źródło
getMyName
Funkcja we fragmencie poniżej zwraca nazwę funkcji wywołującej. Jest to hack i opiera się na niestandardowym funkcji:Error.prototype.stack
. Zwróć uwagę, że format zwracanego ciąguError.prototype.stack
jest różnie zaimplementowany w różnych silnikach, więc prawdopodobnie nie będzie to działać wszędzie:O innych rozwiązaniach:
arguments.callee
nie jest dozwolone w trybie ścisłym iFunction.prototype.caller
jest niestandardowe i niedozwolone w trybie ścisłym .źródło
Innym przypadkiem użycia może być dyspozytor zdarzeń związany w czasie wykonywania:
Zaletą jest to, że dyspozytor może być łatwo ponownie użyty i nie musi odbierać kolejki wysyłki jako argumentu, zamiast tego jest implikowany z nazwą wywołania ...
W końcu ogólny przypadek przedstawiony tutaj to „użycie nazwy funkcji jako argumentu, abyś nie musiał przekazywać jej jawnie”, a to może być przydatne w wielu przypadkach, takich jak opcjonalne wywołanie zwrotne jquery animate (), lub w wywołaniach zwrotnych limitów czasu / interwałów (tzn. przekazujesz tylko NAZWĘ funcion).
źródło
Nazwa obecnej funkcji i sposób jej uzyskania wydaje się zmieniać w ciągu ostatnich 10 lat, odkąd zadano to pytanie.
Teraz, nie będąc profesjonalnym programistą, który zna wszystkie historie wszystkich przeglądarek, jakie kiedykolwiek istniały, oto jak to działa dla mnie w przeglądarce Chrome 2019:
W niektórych innych odpowiedziach wystąpiły błędy Chrome dotyczące ścisłego kodu javascript i nie tylko.
źródło
Ponieważ napisałeś funkcję o nazwie
foo
i wiesz,myfile.js
dlaczego właśnie dlatego potrzebujesz dynamicznie uzyskiwać te informacje?Biorąc to pod uwagę, możesz użyć
arguments.callee.toString()
wewnątrz funkcji (jest to ciąg znaków reprezentujący całą funkcję) i ponownie wyrejestrować wartość nazwy funkcji.Oto funkcja, która wypluje swoją nazwę:
źródło
Kombinacja kilku odpowiedzi, które tu widziałem. (Testowane w FF, Chrome, IE11)
Wywołanie randomFunction () zaalarmuje ciąg zawierający nazwę funkcji.
JS Fiddle Demo: http://jsfiddle.net/mjgqfhbe/
źródło
Zaktualizowaną odpowiedź na to można znaleźć pod następującą odpowiedzią: https://stackoverflow.com/a/2161470/632495
a jeśli nie masz ochoty klikać:
źródło
Informacje są aktualne w 2016 roku.
Wyniki dla deklaracji funkcji
Wynik w Operze
Wynik w Chrome
Wynik w NodeJS
Nie działa w przeglądarce Firefox. Nie przetestowano w IE i Edge.
Wyniki dla wyrażeń funkcyjnych
Wynik w NodeJS
Wynik w Chrome
Nie działa w przeglądarce Firefox, Opera. Nie przetestowano w IE i Edge.
Uwagi:
źródło
Odmiana maszynopisu:
Uwaga dostępna tylko w silnikach zgodnych z ES6 / ES2015. Więcej patrz
źródło
Oto jeden liniowiec:
Lubię to:
źródło
To wariant odpowiedzi Igora Ostroumova :
Jeśli chcesz użyć go jako wartości domyślnej parametru, musisz rozważyć wywołanie drugiego poziomu do „dzwoniącego”:
Umożliwiłoby to dynamicznie implementację wielokrotnego użytku w wielu funkcjach.
Jeśli chcesz również nazwę pliku, oto rozwiązanie wykorzystujące odpowiedź F-3000 na inne pytanie:
źródło
Próbować:
źródło
Odpowiedź jest krótka:
alert(arguments.callee.name);
źródło