Encuentra la definición de función de JavaScript en Chrome

282

Las herramientas de desarrollo de Chrome son geniales, pero una cosa que no parecen tener (que podría encontrar) es una forma de encontrar la definición de una función de JavaScript. Esto sería muy útil para mí porque estoy trabajando en un sitio que incluye muchos archivos JS externos. Claro que grep resuelve esto, pero en el navegador sería mucho mejor. Quiero decir, el navegador tiene que saber esto, ¿por qué no exponerlo? Lo que esperaba era algo como:

  • Seleccione 'Inspeccionar elemento' de la página, que resalta la línea en la pestaña Elementos
  • Haga clic derecho en la línea y seleccione 'Ir a la definición de función'
  • El script correcto se carga en la pestaña Scripts y salta a la definición de la función

En primer lugar, ¿existe esta funcionalidad y simplemente me la estoy perdiendo?

Y si no es así, supongo que esto vendría de WebKit, pero no pude encontrar nada para las solicitudes de funciones de Developer Tool o el Bugzilla de WebKit .

Ryan DuVal
fuente
3
Hay una barra de búsqueda que agrupa el archivo actual en la pestaña Scripts y puede ver el contenido de una función imprimiéndola. Pero ahora tengo curiosidad si hay una manera de hacer una búsqueda más general como usted quiere ...
hugomg
3
Con las Herramientas para desarrolladores de Google Chrome, en la ventana "Fuentes" Toque -> derecha, tiene la posibilidad de establecer "Puntos de interrupción de eventos".
En mi caso, tenía una variable establecida en una función desconocida. Hice myvar.toString () e imprimió: "function Object () {[código nativo]}", que es todo lo que necesitaba saber.
Anillo

Respuestas:

366

Digamos que estamos buscando una función llamada foo:

  1. (abra las herramientas de desarrollo de Chrome),
  2. Windows: ctrl+ shift+ Fo macOS: cmd+ optn+ F. Esto abre una ventana para buscar en todos los scripts.
  3. marque la casilla de verificación "Expresión regular",
  4. buscar foo\s*=\s*function(busca foo = functioncon cualquier número de espacios entre esos tres tokens),
  5. presione en un resultado devuelto.

Otra variante para la definición de funciones es function\s*foo\s*\(para function foo(cualquier número de espacios entre esos tres tokens.

plesiv
fuente
8
¡Ahora de eso estoy hablando! No tenía idea de que ese panel existía, ¿y cómo lo harías?
Ryan DuVal
22
cmd + opción + F en OSX
Stiggler
2
Esta es solo una forma de definir una función llamada foo. Hay otros. ¿Qué pasa si nuestra función es, por ejemplo bar['foo']? (No hay una buena respuesta a esa pregunta, que yo sepa --- es esencialmente "no escriba código complicado")
Steven Lu
1
No pude encontrar "definición de función" usando la respuesta seleccionada. He buscado en Google y no pude encontrar ninguna ayuda. (Usando Chrome versión 41.0.2272.118 m)
Web_Developer
77
Y luego no puede encontrar declaraciones de funciones, expresiones de funciones generadas dinámicamente y funciones anónimas (sin nombre). Prefiero algo como Firefox: haga clic en la referencia de función en el panel de vigilancia -> Saltar a la referencia de función.
Fagner Brack el
77

Esto aterrizó en Chrome el 26-08-2012 No estoy seguro de la versión exacta, lo noté en Chrome 24.

Una captura de pantalla vale más que un millón de palabras:

 Chrome Dev Tools> Consola> Mostrar definición de función

Estoy inspeccionando un objeto con métodos en la consola. Al hacer clic en "Mostrar definición de función" me lleva al lugar en el código fuente donde se define la función. O simplemente puedo pasar el cursor sobre la function () {palabra para ver el cuerpo de la función en una información sobre herramientas. ¡Puedes inspeccionar fácilmente toda la cadena de prototipos de esta manera! CDT definitivamente rock !!!

¡Espero que todos lo encuentren útil!

Dmitry Pashkevich
fuente
1
¿Hay un acceso directo o una función que permita buscar por una referencia de función? como "> inspeccionar (document.body)". Por ahora tengo que d> tmp = {a: myFunc}; > tmp, seguido de "Mostrar definición de función"
Dennis C
16
Creo que puedes hacerdir(myFunc)
Dmitry Pashkevich
dir (myFunc) es mucho mejor, pero aún necesita dos clics y mouse
Dennis C
1
Ah, ¿quieres decir si puedes hacerlo completamente desde el teclado? Algo como findDefinition(myFunc)? AFAIK que aún no existe ...
Dmitry Pashkevich
Si no tiene un objeto que contenga la función, puede crear un objeto a su alrededor y seguirá funcionando. Por ejemplo, en el tipo de consola:, ({1:somefunction})luego haga clic derecho en la función dentro del objeto impreso.
Protector uno
47

Puede imprimir la función evaluando su nombre en la consola, así

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

esto no funcionará para las funciones integradas, solo se mostrarán en [native code]lugar del código fuente.

EDITAR : esto implica que la función se ha definido dentro del alcance actual.

joar
fuente
1
Eso no funciona para mí (incluso con funciones definidas dentro de la página):> toggle_search ReferenceError: toggle_search no está definido
Ryan DuVal
Aah, mira mi edición. De lo contrario, usar la función de búsqueda lo ayudará. Chrome Devtools no es un IDE, es un depurador :)
joar
1
Esto funciona para encontrar la definición actualmente activa de la función.
Patrick
1
En realidad, implica que la función se ha definido dentro del alcance actual .
Jonathan
1
@aroth Al menos en Chrome 45, esto funciona de nuevo. Soy consciente de que las cosas cambiaron en algún punto intermedio cuando esto se publicó y ahora. En conclusión, parece funcionar de nuevo.
joar
32

Actualización de 2016 : en la versión 51.0.2704.103 de Chrome

Hay un Go to memberatajo (listado en settings > shortcut > Text Editor). Abra el archivo que contiene su función (en el sourcespanel de DevTools) y presione:

ctrl+ shift+O

o en OS X:

+ shift+O

Esto permite enumerar y llegar a los miembros del archivo actual.

arthur.sw
fuente
1
bueno, lo que esto parece hacer no es "ir a la definición" de una llamada a una función arbitraria, sino "mostrarle todos los nombres de las funciones en el archivo actual y dejar que vaya a ellos", lo cual también es útil.
Scott Weaver
¡Esto es exactamente lo que estaba buscando, una característica similar a Firefox! En firefox, simplemente puede abrir las herramientas de desarrollo, presionar Ctrl + f, y buscará la función JS en todos los paneles (HTML / CSS / Javascript / etc.). Esto lo hace, a diferencia de las características de expresiones regulares mencionadas en otras respuestas.
javaBean007
@Randy, ¿en qué versión de Chrome? Que sistema operativo Uso la versión 59.0.3071.115 de Chrome en OS X y funciona bien.
arthur.sw
@ arthur.sw Lo siento, no me di cuenta de que tenías que estar en las fuentes para que esto funcione. También esperaba que funcionara en la consola.
Randy
Para mí, se abre un menú de Chrome si presiono esa combinación de teclas en la consola de desarrollo.
Negro
19

Otra forma de navegar a la ubicación de una definición de función sería interrumpir el depurador en algún lugar donde pueda acceder a la función e ingresar el nombre totalmente calificado de las funciones en la consola. Esto imprimirá la definición de la función en la consola y dará un enlace que al hacer clic abre la ubicación del script donde se define la función.

Răzvan Flavius ​​Panda
fuente
17

Los diferentes navegadores hacen esto de manera diferente.

  1. Primero abra la ventana de la consola haciendo clic derecho en la página y seleccionando "Inspeccionar elemento", o presionando F12.

  2. En la consola, escriba ...

    • Firefox

      functionName.toSource()
    • Cromo

      functionName
Deepak Dixit
fuente
la función que estoy buscando es stop () y se usa como onmouseover = "this.stop ();" cuando hago lo que dices, devuelve: stop () {[código nativo]} Entonces, ¿qué hacer ahora?
Tarik
functionName.toSource()También funciona en las últimas versiones de Chrome.
Sourav Ghosh
1
@Tarik Mire la documentación en línea para la construcción stop.
Financia la demanda de Mónica el
@QPaysTaxes Gracias, ahora entiendo que cuando regrese: stop () {[código nativo]} su código nativo significa que no es una función privada, es una función interna y debería buscar la documentación en línea de la función.
Tarik
6

en la consola de Chrome:

debug(MyFunction)
MyFunction()
Igor Krupitsky
fuente
1
Me gusta eso. Notable: haga una undebug(MyFunction)para eliminar el punto de interrupción nuevamente (después de encontrar la implementación del método)
Andreas Dolk
5

Creo que la forma más rápida de localizar una función global es simplemente:

  1. Seleccionar fuentes pestaña .
  2. En el panel Watch, haga clic en + y escriba window
  3. Sus referencias de funciones globales se enumeran primero, alfabéticamente.
  4. Haga clic derecho en la función que le interesa.
  5. En el menú emergente, seleccione Mostrar definición de función .
  6. El panel de código fuente cambia a esa definición de función.
Chris Robinson
fuente
1

En Google Chrome, la herramienta de inspección de elementos puede ver cualquier definición de función de Javascript.

  1. Haga clic en la pestaña Fuentes. Luego seleccione la página de índice. Busca la función.

ingrese la descripción de la imagen aquí

  1. Seleccione la función, luego haga clic derecho en la función y seleccione "Evaluar el texto seleccionado en la consola".

ingrese la descripción de la imagen aquí

subhro
fuente
0

Tuve un problema similar para encontrar la fuente del método de un objeto. El nombre del objeto era myTreey su método era load. Puse un punto de interrupción en la línea a la que se llamó el método. Al volver a cargar la página, la ejecución se detuvo en ese punto. Luego, en la consola de DevTools, escribí el objeto junto con el nombre del método, es decir, myTree.loady presioné Enter. La definición del método se imprimió en la consola:

ingrese la descripción de la imagen aquí

Además, haciendo clic derecho en la definición, puede ir a su definición en el código fuente:

ingrese la descripción de la imagen aquí

Abdollah
fuente