2013-04-03 18 views
7

Czy ktoś może mi powiedzieć, dlaczego użyć jednej deklaracji var dla wielu zmiennych i zadeklarować, że każda zmienna na linii nowej jest dobrym zachowaniem programistycznym?Dlaczego pojedynczy var jest dobry w javascript?

// bad 
var items = getItems(); 
var goSportsTeam = true; 
var dragonball = 'z'; 

// good 
var items = getItems(), 
    goSportsTeam = true, 
    dragonball = 'z'; 
+3

To osobiste preferencje. – Blender

+0

Ma mniej składni. – ChaosPandion

+0

To tylko styl, nie ma znaczenia. – Barmar

Odpowiedz

7

Nie jest uważany za "dobry" lub "zły". To kwestia preferencji.

Facet, który zbudował narzędzie jakości kodu JSLint, Douglas Crockford to lubi.

Jedną z "zalet" może być unikanie możliwości variable hoisting. W JavaScript wszystkie deklaracje var automatycznie przesuwają się na górę zakresu.

Oto dlaczego Crockforda uważa, że ​​druga opcja jest lepsza:

W językach z zakresu bloku, zaleca się zwykle, że zmienne być zadeklarowane w miejscu pierwszego użycia. Ale ponieważ JavaScript nie ma zasięgu bloku, rozsądniej jest zadeklarować wszystkie zmienne funkcji u góry funkcji. Zaleca się użycie pojedynczej instrukcji var dla każdej funkcji. Można tego odmówić za pomocą opcji vars.

+0

Moje rozumienie jest takie, że albo styl jest deklaracją zmiennej i zostałby podniesiony. Jak tego stylu uniknąć? –

+1

@ScottMermelstein W drugim stylu, nie możesz mieć innego kodu między deklaracjami zmiennych, wyjaśnię na ten temat zdanie Crockforda. –

+0

poważnie, uznałem, że drugi styl jest czasami niewygodny. na przykład Muszę szukać, gdzie jest zmienna, jeśli nie jest zdefiniowana w obszarze widocznym na jednym ekranie. – ldsenow

1

To jest preferencja, nie powiedziałbym dobrze ani źle. Tak, JSLint narzeka na to, nie bardzo podoba mi się to, jak narzeka na zmienne pętli for również inline. Powodem, dla którego został umieszczony w JSLint, było zapobieganie możliwym błędom w podnoszeniu.

Również w niektórych przypadkach deklarowanie wszystkich zmiennych u góry prowadzi do nieco mniejszego pliku. Rozważmy następujący:

var a = 10; 
a++; 
var b = 20; 

Po Google Closure prowadzony nad nim

var a=10;a++;var b=20; 

W przeciwieństwie do tego, jeśli będziemy ciągnąć deklarację do góry b „s.

var a=10,b;a++;b=20; 
0

Główną zaletą (oprócz preferencji stylu, myślę), że będzie to uniemożliwić pisanie kodu, który cierpi z powodu niezamierzonych konsekwencji zmiennych wyciągowych.

Weźmy ten przykład:

var foo = function(){alert('foo');} 
function bar(){ 
    foo(); 
    var foo = function(){alert('foobar')}; 
    foo(); 
} 
bar(); 

Czytając ten kod, intencją bar wydaje się być następująca:

  1. połączenia zewnętrzna foo funkcyjny, aby zaalarmować ciąg 'foo'.
  2. Utwórz zmienną lokalną, foo.
  3. Zadzwoń do lokalnej funkcji foo, aby ostrzec ciąg znaków 'foobar'.

W rzeczywistości to, co się dzieje, jest to:

  1. lokalna zmienna foo jest podniesiona do góry funkcji bar.
  2. foo obecnie odnosi się do zmiennej lokalnej zamiast zmiennej zewnętrznej o tej samej nazwie. Ale ponieważ lokalny nie został jeszcze przypisany, jego wartość jest niezdefiniowana. Dlatego, gdy spróbujesz wywołać foo, otrzymasz TypeError.
  3. Nic. Ponieważ rzuciłeś błąd. to jest to! Twój kod się zepsuł.
0

Argumenty dotyczące preferencji Crockfords zostały dobrze wykonane i są prawidłowe. Ja tylko początek, aby powrócić do pierwszego formatu teraz jednak, jak sądzę, że dla doświadczonych programistów, którzy rozumieją zmienny podnoszenia i prawdopodobnie nie godziłoby do niego, są 2 korzyści, które można myślę:

  1. Po dodaniu nowych zmiennych do listy definicji łatwiejsze jest porównywanie. Oznacza to, że najprawdopodobniej wystąpi mniej konfliktów scalających (proste, chociaż mogą być rozwiązane) i mniej obciążeń poznawczych podczas analizy różnic. Z podobnych powodów zostałem również przekonwertowany na zwisające przecinki, których nigdy bym się nie spodziewał xD

  2. Jak już zostało zidentyfikowane, może ułatwić wyszukiwanie definicji zmiennych. Zawsze będziesz w stanie wyszukać var <name> i uzyskać pożądany wynik i nic więcej.

Powiązane problemy