Przewodnik Babela po ES6 mówi:
let
jest nowyvar
.
Najwyraźniej jedyna różnica polega na tym, że var
zakres obejmuje bieżącą funkcję , a let
zakres - bieżący blok . Istnieje kilka dobrych przykładów w tej odpowiedzi .
Nie widzę powodu, by używać var
kodu ES6. Nawet jeśli chcesz objąć daną zmienną całą funkcję, możesz to zrobić, let
umieszczając deklarację na górze bloku funkcyjnego, co i tak powinieneś zrobić, var
aby wskazać rzeczywisty zakres. A jeśli chcesz dokładniej for
określić zakres w bloku lub czymś innym , możesz to zrobić.
Więc mój instynkt polega na tym, żeby przestać var
całkowicie używać podczas pisania kodu ES6.
Moje pytanie brzmi: czy się mylę? Czy jest jakiś uzasadniony przypadek, w którym var
byłoby lepiej niż let
?
javascript
es6
kalus
źródło
źródło
var
jako świadomego wskaźnika, że zmienna ta ma być objęta zakresem całej funkcji, może być przydatną konwencją „samok dokumentującą” .let
instrukcję bezpośrednio u góry funkcji, myślę, że to równie oczywiste, że zamierzałeś objąć ją całą funkcją. Nie sądzę, że używanievar
czyni to bardziej zrozumiałym niż po prostu umieszczenie go na górze.var
nadal istnieje, jest zgodność wsteczna. Gdyby tak nie było,var
całkowicie by usunęli lub nigdy nie przedstawililet
się, zamiast tego zmieniając semantykę navar
to, co prawdopodobnie powinno być od samego początku.var
wydają mi się cienkie i niewystarczające, aby uzasadnić posiadanie trzeciego rodzaju zmiennej, która skacze. Możesz zawęzić zakreslet
do całej funkcji, po prostu umieszczając ją na górze funkcji, co jest o wiele wyraźniejsze w zamiarze niż pisanievar
w bloku (aby wyciągnąć go z tego bloku, abyś mógł następnie użyć go poza blokiem - dziwne). Ostrzega, że jeśli wybierzeszlet
funkcję, to „to tylko pozycja, która sygnalizuje różnicę, a nie składnia”, ale myślę, że to dobrze.var
. przykłady, które przedstawia dla zachowania,var
wydają się wymyślone - i są oparte na poważnych błędach kodowania. O wiele lepiej jest popaść w błąd i zostać zmuszonym do naprawienia takich błędów, niż do korzystania z funkcji językowych, które pozwalają na to! Co dalej, radzimy zawinąć wszystko w try / catch, aby zapobiec awariom? Reszta tego linku jest dobra, ale w ogóle nie zgadzam się z tą konkretną częścią.Odpowiedzi:
Doug Crockford omawia
let
w tym momencie swojego wystąpienia „ The Better Parts ”.Chodzi o to, że
let
unika źródła nieporozumień, szczególnie. dla programistów z oczekiwaniami określonymi przez języki z zakresem blokowym.var
Ma zakres funkcji (deklaruje zmienną, która jest widoczna w całej funkcji), mimo że wygląda jak to ma blokować zakresu .var
być może nadal będzie przydatny w ekstremalnym przypadku, takim jak kod generowany maszynowo, ale mocno się tam rozciągam.(
const
jest również nowy i ma zakres blokowania. Polet x = {'hi': 'SE'}
ponownym przypisaniu dox
, a poconst y = x
tym , gdy nie możesz ponownie przypisać doy
. Często jest to preferowane, ponieważ zapobiega przypadkowej zmianie się pod tobą. Ale dla jasności możesz nadal modyfikować obiekt,y.hi = 'SO'
chyba że zamrozić.)Realistycznie Twoje wrażenie jest właściwe dla ES6: Adopt
let
iconst
. Przestań używaćvar
.(W innym wykonaniu „Lepszych części” Doug mówi, dlaczego
===
dodano, zamiast naprawiać problemy z==
.==
Daje pewne „zaskakujące” wyniki, więc po prostu przyjmij===
.)Przykład ujawnienia
Mozilla Developer Network podaje przykład, w którym
var
nie działa zgodnie z przeznaczeniem. Ich przykład jest realistyczny, który ustawiaonclick
programy obsługi na stronie internetowej. Oto mniejszy przypadek testowy:var
zawodzi nas, ponieważ wszystkie iteracje pętli dzielą tę samąi
zmienną o zakresie funkcji , która ma wartość5
po zakończeniu pętli.źródło
==
wcale nie jest zepsuty. Można to po prostu zdefiniować jakoequality comparison using coersion
Sprawdź na github.com/getify/You-Dont-Know-JS/blob/master/…[ '1.0' == 1.0, [1.0] == 1.0, [1.0] == '1.0', ['1.0'] == 1.0, [null] == '', [null] == 'null', '00' == false, [] == [], [] == 0, [] == '', [] == false, [] == true, [010] - [4] == ' 4.0 ', !![0], !![1], [0] == true, [1] == true, 1 == [[1]], 0 == [[0]], '1' == [1] ]
let
avar
raczej pomiędzylet
,var
aconst
var
działa zgodnie z planem, ale nie tyle osób się spodziewa. To błąd użyteczności, a nie błąd implementacji.Jeśli piszesz poprawny kod, prawdopodobnie będziesz w stanie przekształcić wszystkie
var
instrukcje wlet
instrukcje bez żadnych zmian semantycznych.let
jest preferowane, ponieważ zmniejsza zakres, w którym widoczny jest identyfikator. Pozwala nam to bezpiecznie deklarować zmienne w miejscu pierwszego użycia.const
jest lepszy niżlet
. O ile nie musisz mutować odwołania, użyjconst
deklaracji. Ma to wszystkie zalety związanelet
ze zmniejszaniem obecności zmiennych zunifikowanych i ułatwianiem generowania kodu. Jeśli nie masz pewności, czy będziesz musiał zmutować odwołanie, zadeklaruj je,const
dopóki wyraźnie nie będziesz musiał tego zrobić.źródło
Niekoniecznie uważam, że się mylisz, ale istnieją pewne zastrzeżenia dotyczące używania var. Zasadniczo
let
powinien pomóc programistom obejść głupotę JavaScript, szczególnie w przypadku konfliktów nazw.var
, wydaje się, że ma większy zasięg, ponieważ chce przejść do zakresu funkcji zamykania. Będą chwile, kiedy będziesz potrzebować var, na przykład gdy potrzebujesz zmiennej temp, która będzie dostępna w zakresie bloku wewnątrz funkcji, w przeciwnym razie, preferowanie zamiastlet
var pomoże programistom w konfliktach nazw. Mówiąc prościej, najwyższy czas wprowadzić ES6let
.źródło
var
w bloku jest dostępna w obrębie całej funkcji, a nie w zakresie bloków. To wprowadzająca w błąd funkcja.Zgadzam się, że w es6 powinno się używać tylko „let”. AFIK, ponowne napisanie „let” generuje błąd (co jest dobre), natomiast w „var” po prostu nadpisujesz wartość (choć „tryb ścisły” w es5 też się tym zajmuje).
źródło
let
oznacza „niech zmienna będzie równa”. Innymi słowy, jest to deklaracja, inicjalizacja i zadanie.Istnieje w przeciwieństwie do tego,
const
co oczywiście oznacza „stały” - co jest przeciwieństwem zmiennej.Niektóre inne języki używają przedrostka rzeczywistego obiektu zamiast obiektu podczas deklarowania go (np.
def
Jest skrótem dla „funkcji definiującej” - całkowicie pomijając sens tego, co jest „def”.Let
dodaje tę semantyczną niespójność do Javascript.Logicznie można pozwolić, aby stała była równa coś, ponieważ zadaniem słowa kluczowego „let” jest przypisanie pamięci.
Problem powstaje, ponieważ
var
słowo kluczowe zostało wprowadzone wcześniej, ponieważconst
było obsługiwane, więc zgodność wsteczna dyktuje, żevar
nie musi to oznaczać zmiennej. (Można go również użyć do przypisania stałej wartości.)Stąd wprowadzenie
let
w złej pozycji. Aby upewnić się, że pamiętamy, że leksykalnie, to jest złe, postanowili również zmienić zakres leksykalnylet
vsvar
, więc niespójność jest przede wszystkim w naszych umysłach podczas debugowania.Innymi słowy,
let
istnieje, ponieważ ludzie (czyli opiekunowie języków) uważali, że JavaScript jest zbyt spójny, po opanowaniu wszystkich jego idiomów i osobliwości pragną więcej.Uwaga dodatkowa,
var
nie działa w blokach „strzałkowych”, jeśli chcesz traktować te bloki jako zamknięcia (ponieważvar
wprowadzono je przed traktowaniem bloków jako zamknięcia), alelet
działa.źródło
let
ponieważ jest ona sprzeczna z tonem innych słów kluczowych w tej samej kategorii w JavaScript. To jednak nie odpowiada na pytanie i nie jest szczególnie dobrze postawione. Przesłuchanylet
to nie tylko programiści pragnący większej złożoności. Jest to w rzeczywistości bardziej intuicyjnie zrozumiałe, ponieważ kiedy zapętlasz i zamykasz przez zmienne, zamknięcie zachowuje ostatnią wartość var, ale kiedy robisz to samo w przypadku let, każde zamknięcie w pętli ma własną wartość dla let, a la przykład @ Jerry101 powyżej