Frage

Wir haben eine sehr große JavaScript-Anwendung, wo nach vielen Monaten der Codierung dort zwangsläufig ein paar Umfang Ausrutscher entstanden sind, wo eine Variable ohne Verwendung des var Schlüsselwort in der folgenden Art und Weise definiert ist:

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

statt:

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

Dies geschieht irgendwo - wir sind nicht sicher, wo -. Und für den Variablennamen in Frage Suche ist schwierig, da es sich um ein häufig verwendetes Wort ist, das 1000s mal in unserer Quelle erscheint

Gibt es eine Möglichkeit Firebug zu fragen, auf der Linie zu brechen, die zuerst eine gegebene globale Variable erstellt? Um zu klären, würde ich genau brechen wie zu dem Zeitpunkt, wenn window.x wechselt von undefined auf einen definierten Wert, und zu brechen Aussage.

Ich habe versucht, eine Uhr Ausdruck zu schaffen und hoffte ich es in einen Haltepunkt verwandeln konnte, aber ich kann nicht ohne irgendeine Art von Kontext oder Umfang Uhr Ausdrücke zu schaffen scheinen.

Wenn dies mit Firebug nicht möglich ist, würde ich in etwas interessiert sein, dass dies in Firefox im Allgemeinen erreichen kann.

War es hilfreich?

Lösung

Sofern ein paar Dinge

  1. Sie kennen den Namen der Variablen
  2. Sie haben keine Variable mit diesem Namen im globalen Bereich (außerhalb von Funktionen erklärt), aber nur innerhalb von Funktionen.
  3. Es gibt Aufrufe an die Funktion, die die Variable deklariert.

Dieses kleine Skript würde den Trick tun:

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

Sie werden vor dieser Zuordnung eine Spur des ausgeführten Code erhalten.

Es kann fehlschlagen, einige Situationen zu berichten, so werfen Sie einen Blick auf JSLint . Laden Sie alle Ihre JS-Dateien direkt dort und Flusen sie.

Andere Tipps

Hier ist eine andere Lösung, die nur in Firefox funktioniert, weil es die Firefox-spezifischen verwendet watch Methode.

Setzen Sie dieses Stück Javascript an der Spitze Ihrer HTML-Seite, kurz nach dem <head> Tag:

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

Beachten Sie, dass watch Arbeiten auf einem beliebigen Javascript-Objekt (window ist die globale Javascript-Objekt).

Hier ist die Lösung, die ich durch Modifizierung Ionut G. Stan Lösung am Ende mit:

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

habe ich debugger statt console.trace(), so konnte ich es Mitte der Ausführung stoppen und schauen. Mit console.trace() bekam ich eine Unmenge von Aussagen verfolgen aufgrund dieser Linie viele Male ausgeführt wird.

Der undichte Umfang in Dojo begraben werden sich herausstellte, wo Dojo wird diese Variable auf den Namen eines bearbeiteten Elements zu setzen.

Sehen Sie Ihre Webseite auf dem SeaMonkey Browser (ich verwende Version 1.1.16) und Blick auf die Fehler-Konsole, wird eine Meldung dieser Art für jede Zuordnung zu einer nicht deklarierten Variablen finden Sie unter:

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

Zusätzlich zu Debugging, würde ich raten, Ihren Code mit JSLint zu überprüfen, den unerwarteten Aufgaben im globalen Bereich berichtet als Fehler.

Es gibt mehrere Befehlszeilenbündel JSLint, wie jslint4java , die verwendet werden können, Cross-Plattform in Ant Build-Skripte .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top