Mientras que teóricamente podría escribir una herramienta de análisis estático que detecta el uso de variables globales definidas en otros archivos, como el uso de MyObject
, no podría realizar un seguimiento realista del uso de los métodos de extensión prototype
.
JavaScript es un lenguaje de tipo dinámico así que no hay forma práctica de cualquier herramienta para saber que a
, si pasado de la función g
, es un Array
, y por lo que si f()
se llama en ella hay una dependencia. Solo se determina qué variables contienen qué tipos en tiempo de ejecución, por lo que debe saber que necesita un intérprete y que se ha convertido en un problema completo de Turing.
por no mencionar el otros aspectos dinámicos de JavaScript que desafían completamente análisis estático, como ir a buscar propiedades por notación de corchetes, la temida eval
, o cadenas en tiempos de espera o atributos de evento de controlador.
Creo que es un poco difícil de arrancar realmente. Probablemente sea mejor que rastree las dependencias manualmente, pero simplifíquelas agrupando las funciones relacionadas en módulos que serán su unidad básica de seguimiento de dependencias. OK, obtendrá algunas funciones más que técnicamente necesita, pero espero que no demasiado.
También es una buena idea ponerle nombre a cada módulo, por lo que está muy claro hacia dónde va cada llamada, lo que facilita el control manual de las dependencias (por ejemplo, un comentario // uses: ThisModule, ThatModule
en la parte superior).
Dado que las extensiones de los prototipos incorporados son más difíciles de seguir, manténgalas al mínimo. Extendiendo, por ej. Array
para incluir los métodos de Quinta Edición de ECMAScript (como indexOf
) en navegadores que aún no los tienen es una buena cosa que hacer como corrección básica que usarán todos los scripts. Agregar funcionalidad arbitraria completamente nueva a los prototipos existentes es cuestionable.
¿Desea generar un gráfico que muestre qué funciones son llamadas por qué otras funciones? Eso es lo que estoy tratando de hacer actualmente, y me pregunto si estás tratando de resolver el mismo problema que yo. :) –
@AndersonGreen ¿Estás buscando algo como [Code2Flow] (https://github.com/scottrogowski/code2flow)? –