Znajdź definicję funkcji JavaScript w Chrome

282

Narzędzia deweloperskie Chrome są fajne, ale jedną rzeczą, której wydają się nie mieć (którą mogłem znaleźć), jest sposób na znalezienie definicji funkcji JavaScript. Byłoby to dla mnie bardzo przydatne, ponieważ pracuję na stronie zawierającej wiele zewnętrznych plików JS. Pewnie grep rozwiązuje to, ale w przeglądarce byłoby znacznie lepiej. Mam na myśli, że przeglądarka musi to wiedzieć, więc dlaczego tego nie ujawnić? Spodziewałem się czegoś takiego:

  • Wybierz „Sprawdź element” na stronie, która podświetli linię na karcie Elementy
  • Kliknij linię prawym przyciskiem myszy i wybierz „Przejdź do definicji funkcji”
  • Prawidłowy skrypt jest ładowany do zakładki Skrypty i przechodzi do definicji funkcji

Po pierwsze, czy ta funkcja istnieje i po prostu jej brakuje?

A jeśli nie, to przypuszczam, że pochodzi to od WebKit, ale nie mogłem znaleźć niczego dla żądań funkcji Narzędzia programisty lub Bugzilli WebKit .

Ryan DuVal
źródło
3
Na karcie Skrypty znajduje się pasek wyszukiwania, który grepuje bieżący plik, i można zerknąć na zawartość funkcji, drukując ją. Ale teraz jestem ciekaw, jeśli istnieje sposób na bardziej ogólne wyszukiwanie, jak chcesz ...
hugomg
3
Za pomocą Narzędzi programistycznych Google Chrome, w „Źródłach” Stuknij -> w prawym oknie musisz ustawić „Punkty przerwania zdarzeń”.
W moim przypadku miałem zmienną ustawioną na nieznaną funkcję. Zrobiłem myvar.toString () i wydrukowałem: „function Object () {[kod natywny]}”, co jest wszystkim, co powinienem wiedzieć.
Zadzwoń

Odpowiedzi:

366

Powiedzmy, że szukamy funkcji o nazwie foo:

  1. (otwórz narzędzia deweloperskie Chrome),
  2. Windows: ctrl+ shift+ Flub macOS: cmd+ optn+ F. Otwiera to okno wyszukiwania we wszystkich skryptach.
  3. zaznacz pole wyboru „Wyrażenie regularne”,
  4. szukaj foo\s*=\s*function(wyszukuje foo = functionz dowolną liczbą spacji między tymi trzema tokenami),
  5. naciśnij na zwrócony wynik.

Inny wariant dla definicji funkcji jest function\s*foo\s*\(za function foo(z dowolną liczbą odstępów między tymi trzema żetonami.

plesiv
źródło
8
Teraz o tym mówię! Nie miałem pojęcia, że ​​ta szyba w ogóle istniała - a jak byś miał?
Ryan DuVal
22
cmd + opcja + F w OSX
Stiggler
2
Jest to tylko jeden sposób zdefiniowania funkcji o nazwie foo. Są inni. Co jeśli nasza funkcja to np. bar['foo']? (O ile wiem, nie ma dobrej odpowiedzi na to pytanie - jest to zasadniczo „nie pisz skomplikowanego kodu”)
Steven Lu
1
Nie mogłem znaleźć „definicji funkcji” przy użyciu wybranej odpowiedzi. Szukałem w Google i nie mogłem znaleźć żadnej pomocy. (Korzystanie z wersji Chrome 41.0.2272.118 m)
Web_Developer
7
A potem nie możesz znaleźć deklaracji funkcji, dynamicznie generowanych wyrażeń funkcji i funkcji anonimowych (nienazwanych). Wolę coś takiego jak Firefox: Kliknij odnośnik funkcji w panelu zegarka -> Przejdź do odnośnika funkcji.
Fagner Brack
77

To wylądowało w Chrome w dniu 26.08.2012 Nie jestem pewien dokładnej wersji, zauważyłem to w Chrome 24.

Zrzut ekranu jest wart milion słów:

 Chrome Dev Tools> Konsola> Pokaż definicję funkcji

Sprawdzam obiekt metodami w konsoli. Kliknięcie „Pokaż definicję funkcji” prowadzi mnie do miejsca w kodzie źródłowym, w którym funkcja jest zdefiniowana. Lub mogę po prostu najechać kursorem na function () {słowo, aby zobaczyć treść funkcji w podpowiedzi. Możesz łatwo sprawdzić cały łańcuch prototypów w ten sposób! CDT zdecydowanie rockowy !!!

Mam nadzieję, że wszystkim wam się przyda!

Dmitrij Paszkiewicz
źródło
1
Czy istnieje skrót lub funkcja, która umożliwia wyszukiwanie według odwołania do funkcji? jak „> inspect (document.body)”. Na razie muszę d> tmp = {a: myFunc}; > tmp, a następnie „Pokaż definicję funkcji”
Dennis C
16
Myślę, że dasz radędir(myFunc)
Dmitrij Paszkiewicz
dir (myFunc) jest znacznie lepszy, ale nadal potrzebuje dwóch kliknięć i myszy
Dennis C
1
Masz na myśli to, że możesz to zrobić całkowicie z klawiatury? Coś takiego findDefinition(myFunc)? AFAIK, który jeszcze nie istnieje ...
Dmitrij Paszkiewicz
Jeśli nie masz obiektu zawierającego funkcję, możesz utworzyć obiekt wokół niego i nadal będzie działał. Np. W rodzaju konsoli:, ({1:somefunction})a następnie kliknij prawym przyciskiem myszy funkcję wewnątrz drukowanego obiektu.
Protektor jeden
47

Możesz wydrukować funkcję, oceniając jej nazwę w konsoli

> unknownFunc
function unknownFunc(unknown) {
    alert('unknown seems to be ' + unknown);
}

to nie będzie działać w przypadku wbudowanych funkcji, będą one wyświetlane tylko [native code]zamiast kodu źródłowego.

EDYCJA : oznacza to, że funkcja została zdefiniowana w bieżącym zakresie.

joar
źródło
1
To nie działa dla mnie (nawet w / funkcje zdefiniowane na stronie):> toggle_search ReferenceError: toggle_search nie jest zdefiniowane
Ryan DuVal
Ach, zobacz moją edycję. W przeciwnym razie skorzystanie z funkcji wyszukiwania pomoże. Chrome devtools to nie IDE, to debugger :)
joar
1
Działa to w celu znalezienia aktualnie aktywnej definicji funkcji.
Patrick
1
W rzeczywistości oznacza to, że funkcja została zdefiniowana w bieżącym zakresie.
Jonathan
1
@aroth Przynajmniej w Chrome 45 działa to ponownie. Zdaję sobie sprawę, że coś się zmieniło gdzieś pomiędzy tym, kiedy zostało to opublikowane, a teraz. Podsumowując, wydaje się, że znów działa.
joar
32

Aktualizacja 2016 : w wersji Chrome 51.0.2704.103

Istnieje Go to memberskrót (wymieniony w settings > shortcut > Text Editor). Otwórz plik zawierający twoją funkcję (w sourcespanelu DevTools) i naciśnij:

ctrl+ shift+O

lub w OS X:

+ shift+O

Umożliwia to wyświetlenie listy i dotarcie do członków bieżącego pliku.

arthur.sw
źródło
1
cóż, wydaje się, że nie polega to na „przejściu do definicji” dowolnego wywołania funkcji, ale „pokazaniu wszystkich nazw funkcji w bieżącym pliku i umożliwieniu przejścia do nich” - co też jest trochę przydatne.
Scott Weaver,
Właśnie tego szukałem, funkcja podobna do Firefoksa! W Firefoksie możesz po prostu otworzyć narzędzia deweloperskie, nacisnąć Ctrl + f, a on wyszuka funkcję JS we wszystkich oknach (HTML / CSS / JavaScript / itp.). Robi to, w przeciwieństwie do funkcji wyrażeń regularnych wymienionych w innych odpowiedziach.
javaBean007
@Randy, w której wersji Chrome? Który system operacyjny? Używam Chrome w wersji 59.0.3071.115 na OS X i działa dobrze.
arthur.sw
@ arthur.sw Przepraszamy, nie zdawałem sobie sprawy, że musisz być w źródłach, aby to zadziałało. Spodziewałem się, że zadziała również w konsoli.
Randy,
Dla mnie chromowane menu otwiera się po naciśnięciu tej kombinacji klawiszy w konsoli programisty.
Czarny
19

Innym sposobem na przejście do lokalizacji definicji funkcji byłoby włamanie się do debuggera, gdzie można uzyskać dostęp do funkcji i wprowadzić w konsoli pełną nazwę funkcji. Spowoduje to wydrukowanie definicji funkcji w konsoli i podanie łącza, które po kliknięciu otwiera lokalizację skryptu, w której funkcja jest zdefiniowana.

Răzvan Flavius ​​Panda
źródło
17

Różne przeglądarki robią to inaczej.

  1. Najpierw otwórz okno konsoli, klikając prawym przyciskiem myszy stronę i wybierając „Sprawdź element” lub naciskając F12.

  2. W konsoli wpisz ...

    • Firefox

      functionName.toSource()
    • Chrom

      functionName
Deepak Dixit
źródło
funkcja, której szukam, to stop () i jest używana jako onmouseover = "this.stop ();" kiedy robię to, co mówisz, zwraca: stop () {[kod natywny]} Więc co teraz zrobić?
Tarik,
functionName.toSource()działa również w najnowszych wersjach chrome.
Sourav Ghosh,
1
@ Tarik Spójrz na dokumentację online wbudowanego stop.
Pozew Fund Moniki z
@QPaysTaxes Dzięki, rozumiem teraz, że gdy zwraca: stop () {[kod natywny]} tam kod natywny oznacza, że ​​nie jest to funkcja prywatna, jest to funkcja wewnętrzna i powinienem poszukać dokumentacji online tej funkcji.
Tarik
6

w konsoli Chrome:

debug(MyFunction)
MyFunction()
Igor Krupicki
źródło
1
Lubię to. Warto zauważyć: wykonaj undebug(MyFunction)ponownie, aby usunąć punkt przerwania (po znalezieniu implementacji metody)
Andreas Dolk
5

Uważam, że najszybszym sposobem zlokalizowania funkcji globalnej jest po prostu:

  1. Wybierz źródła kartę .
  2. W okienku Watch kliknij + i wpisz okno
  3. Twoje odwołania do funkcji globalnych są wymienione najpierw w kolejności alfabetycznej.
  4. Kliknij prawym przyciskiem myszy interesującą Cię funkcję.
  5. W menu podręcznym wybierz Pokaż definicję funkcji .
  6. Panel kodu źródłowego przełącza się na definicję tej funkcji.
Chris Robinson
źródło
1

W Google Chrome narzędzie Inspect element można wyświetlić dowolną definicję funkcji JavaScript.

  1. Kliknij kartę Źródła. Następnie wybierz stronę indeksu. Wyszukaj funkcję.

wprowadź opis zdjęcia tutaj

  1. Wybierz funkcję, a następnie kliknij funkcję prawym przyciskiem myszy i wybierz „Oceń zaznaczony tekst w konsoli”.

wprowadź opis zdjęcia tutaj

subhro
źródło
1

Jeśli już debugujesz, możesz najechać kursorem na funkcję, a podpowiedź pozwoli ci przejść bezpośrednio do definicji funkcji:

Podpowiedź / datatip funkcji Chrome Debugger

Dalsza lektura :

KyleMit
źródło
0

Miałem podobny problem ze znalezieniem źródła metody obiektu. Nazwą obiektu była myTreei była to metoda load. Umieściłem punkt przerwania w wierszu, który wywołano metodę. Po ponownym załadowaniu strony wykonanie zatrzymało się w tym momencie. Następnie na konsoli DevTools wpisałem obiekt wraz z nazwą metody, tj. myTree.loadI nacisnąłem Enter. Definicja metody została wydrukowana na konsoli:

wprowadź opis zdjęcia tutaj

Ponadto, klikając prawym przyciskiem myszy definicję, możesz przejść do jej definicji w kodzie źródłowym:

wprowadź opis zdjęcia tutaj

Abdollah
źródło