Este é um artigo sobre depuração com JScript RuntimeObject (MSDN). Embora a maioria desses exemplos não funcione em outros navegadores, eles funcionarão no IE 5.5+.
Identificador global vazado
Por exemplo, digamos que você acidentalmente criou uma propriedade global, como:
função jogarRugby(jogadores) {
var itens,
eu;
len = itens.comprimento;
//Global.
}
função chute() {
variável x = 10
y = 11;
//As I torna y global.
}
Quando playRugby é chamado, a propriedade global len é criada e, se ainda não existir, o valor de items.length é atribuído a ela. Da mesma forma, quando kick é chamado, a propriedade global y é criada.
Nenhuma dessas variáveis globais é intencional. Eles quebram o encapsulamento e revelam detalhes de implementação. Isso pode levar a conflitos e problemas complicados de dependência.
Para detectar esses identificadores globais criados inadvertidamente, podemos usar um loop for in no objeto global. A tag "DOM" do Firebug fornece essa detecção global útil.
Infelizmente, no IE, for in não pode enumerar nenhuma variável global e declaração de função. Dê uma olhada no seguinte exemplo:
// Propriedade da variável global objeto.
var EX1_GLOBAL_VARIABLE = 10;
// Propriedade do objeto global.
this.EX1_GLOBAL_PROPERTY = 11;
// Propriedade da variável global objeto.
função EX1_GLOBAL_FUNCTION(){}
(função(){
var resultados = [];
for(var p neste) {
resultados.push(p);
}
alert("Vazamento:n" + results.join("n"));
})();
No IE, o resultado contém uma combinação de propriedades de janela e uma das quatro propriedades definidas pelo usuário: EX1_GLOBAL_PROPERTY.
Então, o que acontece com as outras três propriedades definidas pelo usuário? Por que eles não aparecem em um loop for in?
Acontece que enumerar um objeto global enumera as propriedades atribuídas ao objeto global, mas não as variáveis globais.
Por que as propriedades globais podem ser enumeradas, mas as variáveis globais não. A experiência nos diz que JScript marca variáveis globais (declaradas com var) como DontEnum. Como os objetos globais são definidos como objetos variáveis globais, esta parece ser uma explicação razoável. Isso não é padrão, mas explica o comportamento no IE. No entanto, Eric Lippert propôs outra explicação: objetos globais e objetos variáveis globais são dois objetos diferentes no IE.
De acordo com MS-ES3:
A declaração de variável em JScript 5.x cria uma propriedade do objeto global, que possui o atributo DontEnum.