Pętla For … in

Zacznijmy od tego, że od około pół roku, ze względu na nową pracę, zmuszony jestem pracować z JavaScriptem. Jako programista PHP nigdy nie przywiązywałem wagi do mojego kodu JS i traktowałem ten język tylko i wyłącznie jako sposób manipulowania DOM. Od wspomnianego pół roku dużo się zmieniło: poznałem magię obiektowości tego języka opartego na prototypach, jego mocne i słabe strony, wiele się nauczyłem a także popełniłem wiele szkolnych błędów.

O jednym z tych szkolnych błędów chciałem dzisiaj napisać. Mianowicie jest to konstrukcja pętli for-in. Mogę się założyć, że wiele osób używa do końca poprawnej formy tej pętli. Moje przekonania potwierdza fakt, że wiele stron traktujących o JS pokazuje czytelnikom tylko tą formę (np. http://www.w3schools.com/js/js_loop_for_in.asp).

Teraz zagadka. Co zrobi poniższy kod?

function print() {
   document.write(id+"\n");
}

function test() {
   var obj = {
      'id1': 'val1',
      'id2': 'val2',
      'id3': 'val3'
   }

   for(id in obj) {
      print();
   }
}

test();

Dokładnie! Wypiszemy wszystkie id’ki mimo, że nie przekazaliśmy nic do funkcji print(). Okazuje się, że id jest zmienną globalną. A jak by inaczej!? JS jest konsekwentny i nawet w nagłówku pętli należy używać słowa kluczowego var. Niestety, jak pisałem, wiele źródeł nam tego nie uświadamia. Jako jeden z niewielu piszę więc – poprawna forma pętli for-in to:

for(var id in obj) {
   kod do wyołania
}

Więcej o pętli for-in:
http://javascriptweblog.wordpress.com/2011/01/04/exploring-javascript-for-in-loops/

Dodaj komentarz