2013-08-31 17 views
5
for(var i = 0; i < 100; i++){ 
    var foo = 5; 

} 

Działa ... ale czy to źle?Deklarowanie zmiennych wiele razy

Wiem, że mogę zadeklarować na zewnątrz var foo, ale dlaczego to robię, gdy używam go tylko w pętli?

+11

W rzeczywistości jest to zadeklarowane tylko raz. Wszystkie deklaracje zmiennych są podnoszone do szczytu ich zakresu (początek funkcji lub zasięg globalny). Bloki nie tworzą zakresu w JavaScript. – bfavaretto

+0

@bfavaretto: Przynajmniej jeszcze nie. – elclanrs

+0

Mimo że semantyka działa jak opisane bfavaretto, wolę "trzymać deklaracje blisko" na stronie użytkowania. Nie zmieni to sposobu zachowania kodu, ale * stwierdzam *, że sprawia, że ​​cel kodu jest jaśniejszy i mogę zeskanować kod, aby sprawdzić, czy coś wygląda podejrzanie nie na miejscu. Inni mogą się nie zgodzić, i to w porządku. – user2246674

Odpowiedz

3

Z biegiem czasu mój osobisty styl urósł do preferowania deklarowania zmiennych tam, gdzie "faktycznie są" w "umyśle" danego języka, w którym pracuję. W przypadku JavaScript oznacza to umieszczanie deklaracji zmiennych i funkcji w pozycjach, w których język i tak ich podniesie.

Jest to dla jasności, precyzyjnej komunikacji, zrozumienia, łatwości utrzymania, aby moje procesy mentalne były równoległe do procesów językowych, by wymienić tylko kilka dobrych powodów.

Tak więc w tym konkretnym przypadku nie wstawiłbym deklaracji var foo = 5; do korpusu pętli for, z tego prostego powodu, że nie robi to, co wygląda, tzn. Nie jest w rzeczywistości redeclaringiem/ponowne ustalanie zakresu zmiennej przy każdej iteracji. (Umieszczenie deklaracji var w części inicjującej nagłówka pętli for: (inicjalizacja; warunek; po myśli) byłoby bardziej sensowne, a na pewno poprawne miejsce na umieszczenie go w językach, które mają zmienne na poziomie bloku, na przykład gdy JavaScript zakończy przyjęcie -Style deklarację dla zakresu blokowego let)

Uwagi:.

  • praktyka ta może nie wydawać się "normalne". Mój umysł woli utrzymywać zmienne "blisko" ich użycia, a moja obecna praktyka nie przychodzi naturalnie do tego, jak działa mój umysł. Ale jako programista przez lata, doświadczenia z dezorientacją, złą komunikacją, nieporozumieniem, niemożliwym do odczytania kodem niemożliwym do rozwikłania itd., Bardziej niż usprawiedliwia dodatkową dyscyplinę, która mi pozwala podążać za tym stylem deklarowania zmiennych w lokalizacjach odpowiadających ich rzeczywisty zasięg, niezależnie od języka.

  • Jedną dodatkową korzyścią dla mnie jest to, że zachęca mnie to do zachowania funkcji modułowych i rozsądnej wielkości.

  • Podobnie postępując zgodnie z tą praktyką, automatycznie pomaga uporządkować mój kod w rozsądny sposób.Na przykład, jeśli umieszczenie moich funkcji na pierwszym miejscu powoduje nadmiar funkcji przed kodem, nad którym pracuję, i dlatego denerwuję się, że muszę przejść dwie strony, aby edytować mój program, po tym stylu automatycznie daje mi motywację do zorganizowania mojego kodu do odpowiedniej struktury odrębnych plików.

P.S. Można by powiedzieć, że niektóre funkcje są tak długie, że praktyka ta sprawia, że ​​deklaracje zmiennych kończą się na stronach z dala od miejsca, w którym są używane. Tak, widziałem kod tam, gdzie to prawda, a może nawet kod, w którym to nie pomoże. Mimo to nie mogę nie zauważyć analogii, która jest równie prawdziwa dla autorów prozy, jak i dla programistów komputerowych. Gdy poziom umiejętności rośnie, długość zdań autorów (i rozmiarów funkcji programistów) rośnie, a następnie, gdy poziom umiejętności wciąż rośnie, długość zdań (i rozmiary funkcji programisty) skracają się raz jeszcze.

+0

Upewnij się, że twoje metody są szczupłe, wtedy nie potrzebujesz tak wielu zmiennych w tak wielu miejscach. Ale wolę też deklarowanie zmiennych tam, gdzie są używane, nawet jeśli zostaną podniesione. –

3

Jest źle, ponieważ daje fałszywe wrażenie, że i i foo są zmiennymi lokalnymi.

for(var i = 0; i < 100; i++){ 
    var foo = 5; 
} 
foo; // 5 

To może nie być problem z prostego kodu, ale jeśli używasz zamknięć okazuje się, że istnieje tylko jeden foo:

var counters = []; 
for (var i = 0; i < 100; i++) { 
    var foo = 5; 
    counters.push(function() { foo++; return foo; }); 
} 
counters[0](); // 6 
counters[0](); // 7 
counters[1](); // 8 (!) 

Aby utworzyć foo w różnym zakresie funkcji musi zostać wprowadzone:

var counters = []; 
for (var i = 0; i < 100; i++) { 
    (function() { 
     var foo = 5; 
     counters.push(function() { foo++; return foo; }); 
    })(); 
} 
counters[0](); // 6 
counters[0](); // 7 
counters[1](); // 6 

Oto prawdziwa natura przykładem rzeczy dzieje się źle z powodu tego: setTimeout in for-loop does not print consecutive values

Od JavaScript 1.7 można użyć słowa kluczowego let (patrz MDN) w celu utworzenia prawdziwych zmiennych lokalnych.

Powiązane problemy