Instrukcja for-in w Internet Explorerze zdaje się nie iterować po wszystkich własnościach obiektu window w Internet Explorerze. Konkretnie, opuszczane są własności dodane do obiektu przez programistę (dynamicznie).

Do testowania może posłużyć poniższy kod:

<script type="text/javascript">
function fff() {
  // pusta funkcja globalna
}
var props = [];
for (var n in window) {             // (1) nie wylapie window.fff
  props.push(n);
}
alert( props.sort().join('\n') );   // (2) na liscie nie ma fff
alert( window.fff );                // (3) tutaj fff jest widoczna!
</script>

Funkcja fff jest zadeklarowana globalnie, więc powinna trafić do obiektu window. W powyższym kodzie wykonuję for-in na obiekcie window, zbierając poszczególne własności window do tablicy props (1). W pierwszym alercie (2) wyświetlam zawartość tablicy props, posortowaną i złączoną znakami nowej linii dla większej czytelności. Na liście własności (odwiedzonych wcześniej przez for-in) nie ma fff.
W następnej instrukcji wyświetlam zawartość zmiennej window.fff i okazuje się, że ona istnieje i ma się dobrze. A wcześniej for-in ją przegapiło.

Takie coś ma miejsce tylko w IE (sprawdzałem w wersji 8). W Firefoxie 3.5 jest OK -- for-in przetwarza również fff. W Operze 10 też. Jestem przekonany, że for-in powinno iterować po [i]wszystkich[/i] własnościach obiektu, nie tylko tych pochodzących z prototypu, wywołania konstruktora, czy czegokolwiek innego. Sprawdziłem i tak też pisze Douglas Crockford w JavaScript: The Good Parts. Błąd ten zdaje się dotyczyć tylko obiektu window i nie występuje, gdy funkcję fff zadeklaruje się poprzez window.fff = function() { ... }.

Czy ktoś może potwierdzić lub obalić istnienie tego problemu? Najbardziej by mnie zaś ucieszyło, jakby ktoś znał jakiś workaround (googlowanie mi nie pomogło) albo powiedział, że jestem debilem i wskazał jakiś głupi błąd w moim teście.

Jeśli kogoś bardzo obchodzi, po co chcę się przeiterować przez wszystkie własności window, to powiem, że chcę sobie zrobić takie małe "reflection". Tworzę bibliotekę, która przetwarza globalne funkcje i obiekty o nazwach pasujących do pewnego wzorca. Musi ona zgarniać definicje funkcji takie jak w pierwszym przykładzie, tj. nie mogę wymagać, by ludzie (nienaturalnie) pisali window.fff = ... .