2009-06-18 20 views
15

Abbiamo un'applicazione JavaScript molto grande, in cui dopo molti mesi di codifica è inevitabilmente spuntato un paio di slip slip in cui una variabile viene definita senza utilizzare la parola chiave var nel modo seguente :Avere interruzione Firebug quando è definita una variabile globale

function() { 
    x = 5; ... 
} 

invece di:

function() { 
    var x = 5; ... 
} 

Questo sta accadendo da qualche parte - non siamo sicuri dove - e cercando il nome della variabile in questione è difficile, dal momento che è una parola comune che appare 1000s di volte nel nostro sou RCE.

C'è un modo per chiedere a Firebug di interrompere la linea che prima crea una determinata variabile globale? Per chiarire, mi piacerebbe rompere esattamente nel momento in cui window.x passa da undefined a un valore definito e all'istruzione break.

Ho provato a creare un'espressione di controllo e spero di poterlo trasformare in un punto di interruzione, ma non riesco a creare espressioni di controllo senza alcun tipo di contesto o ambito.

Se ciò non è possibile con Firebug, sarei interessato a tutto ciò che può realizzare questo in Firefox in generale.

risposta

12

fornito un paio di cose

  1. si conosce il nome della variabile
  2. Non è una variabile con quel nome nel campo di applicazione globale (dichiarata funzioni al di fuori), ma solo all'interno delle funzioni.
  3. Ci sono chiamate alla funzione che dichiara la variabile.

questo piccolo script dovrebbe fare il trucco:

<script type="text/javascript"> 
window.__defineSetter__("x", function(value) { console.trace(); }); 
x = 1; 
</script> 

Otterrete una traccia del codice eseguito prima di questo incarico.

Potrebbe non riuscire a segnalare alcune situazioni, quindi dare un'occhiata a JSLint. Carica tutti i tuoi file JS proprio lì e li lanci.

+0

C'è qualcosa di sbagliato nel formattatore del codice? Non riesco a farlo funzionare con il mio esempio. –

+0

sì, devi aggiungere un sacco di spazi prima di ogni riga per averlo formattato - ha avuto lo stesso problema inserendo la mia domanda :) – Maciek

+0

Approccio molto bello (che funziona!), E grazie per avermi fatto scoprire il \ __ defineSetter \ __ " metodo "magico". – Tibo

2

Ecco la soluzione che ho finito per usare modificando la soluzione di Ionut G. Stan:

window.__defineSetter__("name", function(value) { 
    if (value=="div") { 
    debugger; 
    } 
}); 

ho usato debugger invece di console.trace(), così ho potuto fermare e vedere le cose a metà esecuzione. Con console.trace() ho ottenuto una dichiarazione di traccia di bazillion a causa di questa riga eseguita molte volte.

L'oscilloscopio che perde è risultato essere sepolto in Dojo, dove Dojo imposta tale variabile sul nome di un elemento elaborato.

+0

Inizialmente ho usato "debugger", ma non sono riuscito a vedere la riga in cui è stata assegnata la variabile, quindi ho pensato che non ti aiutasse. Ad ogni modo, sono felice di poterti aiutare. –

+0

Funziona benissimo, grazie. –

+0

+1 per l'aggiornamento della domanda con ciò che ha funzionato per te. – GuruM

1

visualizzare la pagina web sul browser SeaMonkey (io uso la versione 1.1.16) e guardare la console degli errori, verrà visualizzato un messaggio di questo tipo per ogni assegnazione ad una variabile non dichiarata:

Warning: assignment to undeclared variable x 
Source File: http://....js 
Line: ## 
0

Oltre al debug, consiglierei di controllare il codice con JSLint, che segnala come errori gli assegnamenti imprevisti nell'ambito globale.

Esistono diversi pacchetti da riga di comando di jslint, ad esempio jslint4java che possono essere utilizzati su più piattaforme in Ant build scripts.

2

Ecco un'altra soluzione che funziona solo in Firefox perché utilizza il metodo specifico per Firefox watch.

mettere questo pezzo di Javascript in cima della pagina HTML, subito dopo il tag <head>:

<script> 
window.watch('x', function() { debugger }); 
</script> 

Nota che watch opere su qualsiasi oggetto JavaScript (window è l'oggetto globale Javascript).

Problemi correlati