macfan-pl 156 Napisano 7 Lutego 2021 Udostępnij Napisano 7 Lutego 2021 var a; let a; różnica jest jakaś? Cytuj Link to post Share on other sites
Karister 824 Napisano 8 Lutego 2021 Udostępnij Napisano 8 Lutego 2021 (edytowane) 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 8 Lutego 2021 przez Karister Cytuj Link to post Share on other sites
Rozwiązanie mabrothrax 5730 Napisano 23 Marca 2021 Rozwiązanie Udostępnij Napisano 23 Marca 2021 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. 1 Cytuj Link to post Share on other sites
Karister 824 Napisano 7 Kwietnia 2021 Udostępnij Napisano 7 Kwietnia 2021 (edytowane) 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 7 Kwietnia 2021 przez Karister Cytuj Link to post Share on other sites
mabrothrax 5730 Napisano 7 Kwietnia 2021 Udostępnij Napisano 7 Kwietnia 2021 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). 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> Cytuj Link to post Share on other sites
Karister 824 Napisano 7 Kwietnia 2021 Udostępnij Napisano 7 Kwietnia 2021 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 Cytuj Link to post Share on other sites
mabrothrax 5730 Napisano 7 Kwietnia 2021 Udostępnij Napisano 7 Kwietnia 2021 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. Cytuj Link to post Share on other sites
Recommended Posts
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ą.