Este es un artículo sobre la depuración con JScript RuntimeObject (MSDN). Aunque la mayoría de estos ejemplos no funcionarán en otros navegadores, sí funcionarán en IE 5.5+.
Identificador global filtrado
Por ejemplo, digamos que crea accidentalmente una propiedad global, como por ejemplo:
función jugarRugby(jugadores) {
var elementos,
i;
len = artículos.longitud;
// Global.
}
función patada() {
varx = 10
y = 11;
// Mientras hago y global.
}
Cuando se llama a playRugby, se crea la propiedad global len y, si aún no existe, se le asigna el valor de items.length. Del mismo modo, cuando se llama a kick, se crea la propiedad global y.
Ninguna de estas variables globales es intencional. Rompen la encapsulación y revelan detalles de implementación. Esto puede generar conflictos y problemas complicados de dependencia.
Para detectar estos identificadores globales creados inadvertidamente, podemos usar un bucle for in en el objeto global. La etiqueta "DOM" de Firebug proporciona esta útil detección global.
Desafortunadamente, en IE, for in no puede enumerar ninguna variable global ni declaración de función. Eche un vistazo al siguiente ejemplo:
// Propiedad del objeto variable global.
var EX1_GLOBAL_VARIABLE = 10;
// Propiedad del objeto global.
this.EX1_GLOBAL_PROPERTY = 11;
// Propiedad del objeto variable global.
función EX1_GLOBAL_FUNCTION(){}
(función(){
var resultados = [];
for(var p en esto) {
resultados.push(p);
}
alerta("Filtrado:n" + resultados.join("n"));
})();
En IE, el resultado contiene una combinación de propiedades de ventana y una de las cuatro propiedades definidas por el usuario: EX1_GLOBAL_PROPERTY.
Entonces, ¿qué pasa con las otras tres propiedades definidas por el usuario? ¿Por qué no aparecen en un bucle for in?
Resulta que enumerar un objeto global enumera las propiedades del objeto global asignadas pero no las variables globales.
Por qué las propiedades globales se pueden enumerar pero las variables globales no. La experiencia nos dice que JScript marca las variables globales (declaradas con var) como DontEnum. Dado que los objetos globales se definen como objetos variables globales, esta parece una explicación razonable. Esto no es estándar pero explica el comportamiento en IE. Sin embargo, Eric Lippert propuso otra explicación: los objetos globales y los objetos variables globales son dos objetos diferentes en IE.
Según MS-ES3:
La declaración de variable en JScript 5.x crea una propiedad del objeto global, que tiene el atributo DontEnum.