Domanda

Abbiamo un'applicazione JavaScript molto grande, dove dopo molti mesi di codifica sono sorti inevitabilmente un paio di slittamenti di ambito in cui una variabile viene definita senza utilizzare la parola chiave var nel modo seguente:

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

anziché:

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

Questo sta accadendo da qualche parte - non siamo sicuri di dove - e cercare il nome della variabile in questione è difficile, dal momento che è una parola comune che appare migliaia di volte nella nostra fonte.

C'è un modo per chiedere a Firebug di interrompere la linea che crea per prima una data variabile globale? Per chiarire, vorrei interrompere esattamente nel momento in cui window.x passa da undefined a un valore definito e interrompere la dichiarazione.

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

Se ciò non fosse possibile con Firebug, sarei interessato a tutto ciò che può farlo in Firefox in generale.

È stato utile?

Soluzione

Fornito alcune cose

  1. Conosci il nome della variabile
  2. Non hai una variabile con quel nome nell'ambito globale (dichiarata funzioni esterne), ma solo all'interno di funzioni.
  3. Ci sono chiamate alla funzione che dichiara la variabile.

questo piccolo script farebbe il trucco:

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

Riceverai una traccia del codice eseguito prima di tale assegnazione.

Potrebbe non essere possibile segnalare alcune situazioni, quindi dai un'occhiata a JSLint . Carica tutti i tuoi file JS proprio lì e sfilacciali.

Altri suggerimenti

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

Metti questo pezzo di Javascript nella parte superiore della tua pagina html, subito dopo il tag <head>:

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

Nota che window funziona su qualsiasi oggetto Javascript (<=> è l'oggetto Javascript globale).

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

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

Ho usato debugger invece di console.trace(), quindi potevo fermarmi e guardarlo a metà esecuzione. Con <=> ho ricevuto una bazillion di dichiarazioni di traccia a causa dell'esecuzione di questa riga molte volte.

L'ambito che perde si è rivelato essere sepolto nel Dojo, dove Dojo sta impostando quella variabile sul nome di un elemento elaborato.

Visualizza la tua pagina web sul browser SeaMonkey (utilizzo la versione 1.1.16) e guarda la console degli errori, vedrai un messaggio di questo tipo per ogni assegnazione a una variabile non dichiarata:

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

Oltre al debug, ti consiglio di controllare il tuo codice con JSLint , che riporta compiti imprevisti nell'ambito globale come errori.

Esistono diversi bundle di jslint da riga di comando, come jslint4java che possono essere utilizzati multipiattaforma in Script di compilazione di formiche .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top