2012-03-17 12 views
6

Jakie jest mniej podatne na błędy podejście do deklarowania zmiennych w JavaScript?Konwencje kodu JavaScript - deklaracja zmiennej

var a; 
var b; 
var c; 

lub

var a, 
    b, 
    c; 

jQuery i Dojo użyć drugiego podejścia i osobiście to moja ulubiona pod względem czytelności kodu, problemem jest to, że trudniej debugowania.

Przykład 1:

var a, 
    b, 
    c; // oops.. semicolon instead of comma 
    d, 
    e; 

Przykład 2:

Podczas poszukiwania pewnej zmiennej w projekcie var wyróżnia się lepiej, że zmienna jest zadeklarowana.

EDIT: Oryginalne przykłady były błędne, popełniłem błąd podczas kopiowania i wklejania. Kod jest już zaktualizowany, przepraszam za incovenient.

+1

Czy zamiast przecinków użyto średników? To rzuca niezdefiniowane błędy zmiennych w Safari. –

+0

@JeffreySweeney czy uruchomiłeś kod z błędem? przecinki działają dobrze. – david

+0

@david Przecinki nie, ale średniki nie. –

Odpowiedz

5

Wiele deklaracji zmiennych (zamiast łączonych) jest mniej podatnych na błędy z powodów, o których wspomniałeś. Jednak połączone deklaracje mają kilka innych zalet:

  • JSLint i ewentualnie inne linters będą narzekać na wiele słów kluczowych var według zakresu.
  • Jedno słowo kluczowe var zminimalizuje lepiej niż wiele z oczywistych powodów.
  • Łączenie deklaracji zmusza do zadeklarowania zmiennych w jednym miejscu, prawdopodobnie blisko początku funkcji, w której się znajdują, co jest uważane za dobrą praktykę.

Z drugiej strony, jak już wspomniano, błędy można wprowadzać za pomocą złożonych deklaracji zmiennych, i mogą one być niezręcznie reprezentowane w różnicach.

Dopóki zachowasz spójny styl deklaracji zmiennych w całym projekcie, styl, który wybierzesz, nie powinien mieć znaczenia.

0

Druga opcja jest lepsza w mojej książce, ponieważ jest mniej zbędna. Nowoczesne przeglądarki i IDE sprawiają, że dość łatwo jest znaleźć błąd, który wywołujesz.

Oto jsFiddle, który pokazuje, co się dzieje. Przypadkowe wstawienie średnika w serii powoduje Uncaught ReferenceError. Jest to szybkie rozwiązanie i mały kompromis dla ładniejszej składni. Jeśli jest to najgorszy błąd, z którym musisz sobie poradzić podczas pisania JavaScript, masz świetny dzień.

Jak na ironię, w drugim przykładzie miałeś literówkę - średnik po a. Whoops. :)

EDIT: Oryginalny plakat poprawiono literówka; Zostawiam wzmiankę, ponieważ jest to istotne dla pierwotnego pytania.

+0

Błędy takie jak ten, który zrobił, pierwsza opcja lepiej :) – Ramesh

+0

@Josh Earl Już to naprawiłem, dzięki. –

1
var a; 
var b; 
var c; 

jest lepszym rozwiązaniem, ponieważ nie spowoduje odrzucenia nieokreślonego błędu. Również zmienne będą mieć odpowiednio zakres & nie w zasięgu globalnym.

var a=10; 
    b=5; 

spowoduje b w zasięgu globalnym.

EDYCJA: To było w kontekście z próbką wysłaną pierwotnie https://stackoverflow.com/revisions/9746359/2. Dzięki zaktualizowanemu kontekstowi sprowadza się on do bardziej indywidualnych preferencji. Moim zaleceniem będzie, aby nie było miejsca na takie błędy, jak trudno je znaleźć.

+3

"zmienne będą odpowiednio dopasowane, a nie w zasięgu globalnym." Co??? Zmienne są podnoszone do wierzchołka zakresu, ale funkcja() {var a, b, c; } nadal ma zmienne o zakresie jak w funkcji. – Corbin

+0

@Ramesh Tak ... nie tak bardzo.Jedynym razem, gdy zmienna automatycznie kończy się zasięgiem globalnym, jest wtedy, gdy nie jest zadeklarowana. Pyta o równoważne style deklarowania zmiennej - niekoniecznie umieszcza zmienne w zasięgu globalnym. –

+1

Mały błąd przy przypisywaniu jak var a = 10; b = 15; spowodowałoby uzyskanie globalnego zasięgu. Jego pytanie początkowo miało var a; b, c; – Ramesh

2

Preferuję Twoje drugie podejście do używania tylko jednego słowa kluczowego var. Niedawno zrobiłem to o krok dalej i utworzyłem instancję typów dla każdej zmiennej, aby pomóc mi zapobiec późniejszemu przekształcaniu typu niezamierzonego. Przykład:

var a = 0, 
    b = 0, 
    c = {}, 
    d = [], 
    f = ""; 

Podam tutaj wartość rzeczywistą, jeśli mam wartość do dostarczenia w tym miejscu. Jeśli nie mogę dostarczyć następujące wartości nieużywane:

  • 0 dla typów numerycznych
  • [] na tablicy
  • {} dla obiektu dosłownym i DOM węzłów
  • "" na ciąg
  • function() {return;} dla funkcji
  • false dla boolean
  • w tym celu nie martwię się o wstępne przypisywanie typów dla typów Math, Date lub RegExp.
+0

To wydaje się być doskonałym rozwiązaniem, które zapobiega również słabym typom powiązanych błędów. –

+0

Moja główna motywacja to wydajność. Najnowsi tłumacze preferują ścisłe pisanie, więc musiałem zmienić moje zachowanie i styl, aby dostosować się do tego nowego nieoficjalnego wymogu profesjonalnej jakości kodowania. – austincheney

+2

Dlaczego 'function() {return;}'? 'function() {}' zrobiłoby to samo. – icktoofay

0

Istnieje jedna premia do posiadania wielorakiej deklaracji zmiennej za pomocą 1 var.

Możesz uzyskać niższy skrócone skrypt. Oczywiście 4 bajty wymagane do otrzymania deklaracji var nie mają większego znaczenia, dopóki nie pojawi się takie miejsce jak stackoverflow.com. Miliony na miliony pobrań == gigabajty transferu w oparciu o kilka dodatkowych deklaracji var.

+1

Dobry minifier jak UglifyJS automatycznie zmiażdży sekwencyjne instrukcje var w jeden, renderując ten punkt moot –

Powiązane problemy