Skocz do zawartości

Var a let; różnica


Idź do rozwiązania Problem ogarnięty przez mabrothrax,

Recommended Posts

Brakuje szklanej kuli, aby zgadnąć język. Może to być odróżnienie stałej od zmiennej (np w Swift) albo ograniczenie zakresu zmiennej (np w ES6). Poza tym zmienne deklarowane przez let w ES6 są leniwe. Jeśli nadal mam zakładać, że chodzi o ES6, to główną zaletą let względem var jest to, że przy referowaniu tak zadeklarowanej zmiennej w domknięciu masz kopię o aktualnej wartości zamiast bindowania do oryginału, co pozwala uniknąć masy głupich i trudnych do znalezienia błędów.

Edytowane przez Karister
Link to post
Share on other sites
  • 1 miesiąc temu...
  • Rozwiązanie

Różnica jest bardzo prosta. Var to zmienna lokalna dla scope'u np. działająca w kontekście funkcji, let natomiast to zmienna w szerszym scop'ie czyli w całym bloku kodu np. w pętli.

 

Aczkolwiek nic nie stoi na przeszkodzie by używać ich naprzemiennie.

 

Polecam również zgłębić temat hoistingu zmiennych i funkcji, trochę to rozjaśni powyższą kwestię dodatkowo.

 

 

 

  • Dzięki 1
Link to post
Share on other sites
  • 2 tygodnie później...
W dniu 23.03.2021 o 06:53, mabrothrax napisał:

Var to zmienna lokalna dla scope'u np. działająca w kontekście funkcji, let natomiast to zmienna w szerszym scop'ie czyli w całym bloku kodu np. w pętli.

Swój poziom wiedzy o JS określiłbym jako słaby, ale powiedziałbym, że let jest właśnie w węższym scopie. var jest per cała funkcja - owszem - a let jest bardziej lokalna.

 

W dniu 23.03.2021 o 06:53, mabrothrax napisał:

Aczkolwiek nic nie stoi na przeszkodzie by używać ich naprzemiennie.

W związku z powyższym raczej stoi. Całkowita zmiana działania programu przy bezrefleksyjnej zamianie jednego na drugie.

 

To wyświetli numer danego diva po jego kliknięciu (1, 2 lub 3):

<div id="div1">1</div>
<div id="div2">2</div>
<div id="div3">3</div>
for (let i = 1; i <= 3; i++) {
  $("#div" + i).click(function () { console.log(i); });
}

 

Zamień let na var i każdy zacznie wyświetlać 4 zamiast swojego numeru. Najwyraźniej var jest to jedna zmienna w szerszym scopie (całej funkcji), a let jest bardziej lokalne (per blok pętli). Żeby działało z var trzeba sobie zbindować zmienne:

for (var i = 1; i <= 3; i++) {
  $("#div" + i).click(function(x) { console.log(x); }.bind(this, i));
}

albo zwalić zrobienie kopii na język:

function print(i) {
  return function() { console.log(i); }
}
for (var i = 1; i <= 3; i++) {
  $("#div" + i).click(print(i));
}

 

Edytowane przez Karister
Link to post
Share on other sites

To co tutaj zaprezentowałeś to zasadniczo to co napisałem, var może być użyty jako zmienna lokalna w rozumieniu funkcji, let w scop'ie bloku (czy to petli czy też całego skryptu).

 

YaiZiPJ.png

 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

 

https://developer.mozilla.org/pl/docs/Web/JavaScript/Reference/Statements/var

 

Poczytaj również o hoistingu i TDZ jeśli chcesz się dowiedzieć coś więcej.

 

I na chwilę wracając do Twojego przykładu. Przykład przykładowi nie równy, tutaj masz taki w którym nie ma żadnej różnicy którego rodzaju zmiennej używasz - i o to właśnie mi chodziło, o kontekst. Można używać ich namprzemiennie, w zależności od potrzeb.

 

Ogólnie za dobrą praktyke w web devie jest przez wielu aktualnie uważane zrezygnowanie z var'ów i używanie tylko i wyłącznie let oraz const.

 

<html>
    <head>
        <meta charset="UTF-8">
    </head>
<body>
    <div name="klikacz" id="1">1</div>
    <div name="klikacz" id="2">2</div>
	<div name="klikacz" id="3">3</div>
    
    <script> 
        let divs = document.getElementsByName("klikacz")
		
		divs.forEach((el) => {
				el.addEventListener('click', ()=> {
				console.log('KLIKNĄŁEŚ W ', el.id)
			});
		})
    </script>
</body>
</html>

 

Link to post
Share on other sites
4 godziny temu, mabrothrax napisał:

I na chwilę wracając do Twojego przykładu. Przykład przykładowi nie równy, tutaj masz taki w którym nie ma żadnej różnicy którego rodzaju zmiennej używasz - i o to właśnie mi chodziło, o kontekst. Można używać ich namprzemiennie, w zależności od potrzeb.

 

Ale wiesz, dowód przez zaprzeczenie wymaga jednego konkretnego przykładu. Powiem szczerze, że nie kupuję ogólnego stwierdzenia, że można ich używać naprzemiennie. Czasem się uda, a czasem nie. Jak widać, już bardzo podstawowy kod powoduje, że łatwo o błąd i rozjazd. Zwłaszcza, gdy pyta ktoś, kto zaczyna naukę i po przeczytaniu, że może ich używać zamiennie, będzie to wszędzie robić bez żadnej refleksji i potem zdziwko, że nie działa. Zdecydowanie bardziej siada mi to:

 

4 godziny temu, mabrothrax napisał:

Ogólnie za dobrą praktyke w web devie jest przez wielu aktualnie uważane zrezygnowanie z var'ów i używanie tylko i wyłącznie let oraz const

 

Link to post
Share on other sites

Dlatego też poradziłem poczytać o hoistingu i TDZ bo zasadniczo jest to wszystko z tym związane, o czym sobie tutaj debatujemy.

 

Niczego nigdy nie powinno się robić bez żadnej refleksji, szczególnie jeśli chodzi o programowanie - bo później faktycznie można się zdziwić :)

 

Tak czy siak, temat raczej wyczerpany.

Link to post
Share on other sites

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Odpowiedz w tym wątku...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...