Это статья об отладке с помощью JScript RuntimeObject (MSDN). Хотя большинство этих примеров не будут работать в других браузерах, они будут работать в IE 5.5+.
Утечка глобального идентификатора
Например, предположим, что вы случайно создали глобальное свойство, например:
функция playRugby(игроки) {
вар элементы,
я;
лен = предметы.длина;
// Глобальный.
}
функция удар() {
вар х = 10
у = 11;
// Как я делаю y глобальным.
}
При вызове playRugby создается глобальное свойство len, и если оно еще не существует, ему присваивается значение items.length. Аналогично, при вызове кика создается глобальное свойство y.
Ни одна из этих глобальных переменных не является преднамеренной. Они нарушают инкапсуляцию и раскрывают детали реализации. Это может привести к конфликтам и сложным проблемам с зависимостями.
Чтобы обнаружить эти случайно созданные глобальные идентификаторы, мы можем использовать цикл for для глобального объекта. Тег Firebug «DOM» обеспечивает это полезное глобальное обнаружение.
К сожалению, в IE in не может перечислять глобальные переменные и объявления функций. Взгляните на следующий пример:
// Свойство объекта глобальной переменной.
вар EX1_GLOBAL_VARIABLE = 10;
// Свойство глобального объекта.
это.EX1_GLOBAL_PROPERTY = 11;
// Свойство объекта глобальной переменной.
функция EX1_GLOBAL_FUNCTION(){}
(функция(){
вар результаты = [];
for(var p в этом) {
результаты.push(p);
}
alert("Утечка:n" + results.join("n"));
})();
В IE результат содержит комбинацию свойств окна и одного из четырех пользовательских свойств: EX1_GLOBAL_PROPERTY.
Итак, что же происходит с тремя другими пользовательскими свойствами? Почему они не отображаются в цикле for in.
Оказывается, при перечислении глобального объекта пересчитываются назначенные свойства глобального объекта, но не глобальные переменные.
Почему глобальные свойства можно перечислять, а глобальные переменные — нет. Опыт подсказывает нам, что JScript помечает глобальные переменные (объявленные с помощью var) как DontEnum. Поскольку глобальные объекты определяются как объекты глобальных переменных, это кажется разумным объяснением. Это не стандартно, но объясняет поведение IE. Однако Эрик Липперт предложил другое объяснение: глобальные объекты и объекты глобальных переменных — это два разных объекта в IE.
Согласно MS-ES3:
Объявление переменной в JScript 5.x создает свойство глобального объекта, имеющее атрибут DontEnum.