Dies ist ein Artikel über das Debuggen mit JScript RuntimeObject (MSDN). Obwohl die meisten dieser Beispiele in anderen Browsern nicht funktionieren, funktionieren sie in IE 5.5+.
Durchgesickerte globale Kennung
Angenommen, Sie erstellen versehentlich eine globale Eigenschaft wie:
Funktion playRugby(Spieler) {
Var-Artikel,
ich;
len = items.length;
// Global.
}
Funktion kick() {
var x = 10
y = 11;
// Wie ich dich global mache.
}
Wenn playRugby aufgerufen wird, wird die globale Eigenschaft len erstellt, und falls sie noch nicht vorhanden ist, wird ihr der Wert von items.length zugewiesen. Ebenso wird beim Aufruf von kick die globale Eigenschaft y erstellt.
Keine dieser globalen Variablen ist beabsichtigt. Sie durchbrechen die Kapselung und enthüllen Implementierungsdetails. Dies kann zu Konflikten und kniffligen Abhängigkeitsproblemen führen.
Um diese versehentlich erstellten globalen Bezeichner zu erkennen, können wir eine for-in-Schleife für das globale Objekt verwenden. Das „DOM“-Tag von Firebug bietet diese nützliche globale Erkennung.
Leider kann for in im IE keine globalen Variablen und Funktionsdeklarationen auflisten. Schauen Sie sich das folgende Beispiel an:
// Eigenschaft des globalen Variablenobjekts.
var EX1_GLOBAL_VARIABLE = 10;
// Eigenschaft des globalen Objekts.
this.EX1_GLOBAL_PROPERTY = 11;
// Eigenschaft des globalen Variablenobjekts.
Funktion EX1_GLOBAL_FUNCTION(){}
(Funktion(){
var results = [];
for(var p in this) {
results.push(p);
}
Alert("Durchgesickert:n" + results.join("n"));
})();
Im IE enthält das Ergebnis eine Kombination aus Fenstereigenschaften und einer von vier benutzerdefinierten Eigenschaften: EX1_GLOBAL_PROPERTY.
Was passiert also mit den anderen drei benutzerdefinierten Eigenschaften? Warum werden sie nicht in einer for-in-Schleife angezeigt?
Es stellt sich heraus, dass beim Aufzählen eines globalen Objekts die zugewiesenen globalen Objekteigenschaften, nicht jedoch die globalen Variablen aufgezählt werden.
Warum globale Eigenschaften aufgelistet werden können, globale Variablen jedoch nicht. Die Erfahrung zeigt, dass JScript globale Variablen (deklariert mit var) als DontEnum markiert. Da globale Objekte als globale Variablenobjekte definiert sind, scheint dies eine vernünftige Erklärung zu sein. Dies ist kein Standard, erklärt aber das Verhalten im IE. Eric Lippert schlug jedoch eine andere Erklärung vor: Globale Objekte und globale Variablenobjekte sind im IE zwei verschiedene Objekte.
Laut MS-ES3:
Die Variablendeklaration in JScript 5.x erstellt eine Eigenschaft des globalen Objekts, das über das DontEnum-Attribut verfügt.