Czy istnieją jakieś korzyści z używania słowa kluczowego "var" w ES6?

0

Czy jest jakiś sens używania nadal słowa kluczowego var w ES6 do deklarowania zmiennych przez osoby, które rozumieją działanie var, let i const (nawet w trybie strict), znają różnice między nimi i wiedzą, na czym polega hoisting, zasięg funkcji, zasięg bloku, umieją w poprawny sposób pisać kod wykorzystujący zmienne (liczniki) pętli później niż od razu itp? Nie pytam o takie zalety, które mogą powodować ograniczenie możliwości popełnienia błędu lub zrozumienia kodu przez programistę bez odpowiedniej wiedzy.

Kyle Simpson w swojej książce Tajniki języka JavaScript. Zakresy i domknięcia pisze:

Być może trudno w to uwierzyć, ale zakresu bloku nie należy traktować jako bezwarunkowego zamiennika dla zakresu funkcji tworzonego przez var. Obie funkcjonalności mogą współistnieć, programiści mogą i powinni odpowiednio stosować obie techniki (zakres funkcji i zakres bloku), aby tworzyć kod lepszy, czytelniejszy i łatwiejszy w obsłudze.

Autor nie tłumaczy, dlaczego warto w niektórych sytuacjach nadal używać var. Ja mam wrażenie, że autor jest fanatykiem i szkoda mu rozstawać się z poznanymi w bardzo ponadprzeciętnym stopniu zasadami działania języka JavaScript, dlatego czasami namawia do używania takich funkcjonalności, o których zwykle mówi się, że są przestarzałe albo niebezpieczne. W tym drugim przypadku autor zaleca dobre ich poznanie i wykorzystanie ich zalet w prawidłowy sposób.

Gdy szukam opinii w internecie, to widzę dużo takich, które zachęcają do używania zawsze let i const zamiast var.

Czy są jakieś korzyści z używania var poza zachowaniem zgodności ze starszymi wersjami ES?

0

Jedyny taki przypadek, który mi przyszedł do głowy, używa funkcji eval, więc jest kiepski i w dodatku ciężko mi wymyślić jakieś przydatne zastosowanie takiego pomysłu.

function f() {
    try {
        v;
    }
    catch (err) {
        eval("var v;");
    }

    v;
}

Jeśli zmienna v nie jest zadeklarowana w zakresie, to zostaje obsłużony błąd ReferenceError i zmienna zostaje zadeklarowana w całym zakresie funkcji f. W takim przypadku użycie słowa kluczowego let zamiast var spowoduje utratę korzyści i wykonanie drugiej instrukcji v; spowoduje wystąpienie błędu.

Kiepskie jest to, że w takim przypadku zadeklarowanie zmiennej v jeszcze raz za instrukcją try...catch z użyciem słowa kluczowego let spowoduje wystąpienie błędu z powodu ponownej deklaracji.

Mój przykład jest brzydki i niepraktyczny. Liczę na ciekawsze pomysły.

0

Jeszcze z 2 lata temu V8 lepiej sobie radził z var niż let i nie potrafił sensownie optymalizować letów szczególnie w połączeniu z pętlami. Jak to wygląda teraz - nie wiem, ale znając życie pewnie nie ma to wielkiego znaczenia. Już wtedy zresztą różnica była subtelna dla większości osób i imho była to niepotrzebna optymalizacja w porównaniu do tego jakie faktycznie bottlenecki potrafią mieć współczesne aplikacje. Var stwarzało zawsze sporo problemów i nawet doświadczony programista mógł popełnić błąd używając tego, ot tak, po prostu z roztargnienia. Ja osobiście nie widzę korzyści z zastosowania i są imho znacznie ważniejsze rzeczy, nad którymi warto się "spuszczać", niż debaty var vs. let vs. const. ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1