Mentre si potrebbe teoricamente scrivere un tool di analisi statica che ha rilevato l'uso di variabili globali definiti in altri file, come l'uso di MyObject
, non è possibile tracciare realisticamente l'utilizzo dei metodi di estensione prototype
.
JavaScript è un linguaggio dinamicamente tipizzato in modo non c'è modo pratico per qualsiasi strumento per sapere che a
, se approvata dalla funzione g
, è un Array
, e quindi se f()
è chiamato su di esso c'è una dipendenza. Viene determinato solo quali variabili tengono i tipi in fase di esecuzione, in modo da scoprire che è necessario un interprete e che si è creato un problema completo di Turing.
Per non parlare degli altri aspetti dinamici di JavaScript che sfidano completamente l'analisi statica, come il recupero delle proprietà mediante notazione a parentesi quadre, il temuto eval
o le stringhe in timeout o gli attributi del gestore eventi.
Penso che sia un po 'un antipasto davvero. Probabilmente stai meglio monitorare manualmente le dipendenze, ma semplificarlo raggruppando le funzioni correlate in moduli che saranno la tua unità di base del monitoraggio delle dipendenze. OK, inserirai qualche altra funzione di cui hai bisogno tecnicamente, ma si spera non troppo.
È anche una buona idea assegnare uno spazio ai nomi per ogni modulo, quindi è molto chiaro dove ogni chiamata sta andando, rendendo più facile mantenere le dipendenze in controllo manualmente (ad esempio con un commento // uses: ThisModule, ThatModule
in alto).
Poiché le estensioni dei prototipi incorporati sono più difficili da tenere traccia di, mantenerle al minimo. Estendendo ad es. Array
per includere i metodi ECMAScript della Quinta Edizione (come indexOf
) sui browser che non li hanno già è una buona cosa da fare come una correzione di base che tutti gli script useranno. L'aggiunta di funzionalità arbitrarie completamente nuove ai prototipi esistenti è discutibile.
Vuoi generare un grafico che mostri quali funzioni sono chiamate da quali altre funzioni? Questo è quello che sto attualmente cercando di fare, e mi chiedo se stai cercando di risolvere lo stesso problema che io sono. :) –
@AndersonGreen Stai cercando qualcosa come [Code2Flow] (https://github.com/scottrogowski/code2flow)? –