chevron-left chevron-right

Piotr Nalepa Frontend, architektura i AI

[JS] Jak używać let i const w kodzie JavaScript?

Ta wersja
blog.piotrnalepa.pl/2017/04/13/js-jak-uzywac-let-i-const-w-kodzie-javascript
Opublikowano
Autor
, Staff Software Engineer
Kategorie
DSP2017, JavaScript
Uwagi
Napisz do mnie · Napisz na X

Ten wpis ma 9 lat. Od tego czasu przeglądarki i narzędzia mogły się zmienić, więc zanim użyjesz kodu, sprawdź go z aktualną dokumentacją.

Wraz z nadejściem standardów ES6+ w kodzie JavaScript na dobre zagościły nowe sposoby deklaracji zmiennych. W przeszłości można było korzystać tylko z var. Lecz już od jakiegoś czasu nic nie stoi na przeszkodzie, aby korzystać z nowocześniejszych rozwiązań.

Za pomocą let i const możesz deklarować zmienne podobnie jak za pomocą var. Najważniejszą zmianę jaką one wprowadzają to zasięg zmiennych. W przypadku korzystania z var to występuje tzw. hoisting. Hoisting polega na tym, że wszystkie zmienne zadeklarowane za pomocą var są przenoszone w fazie kompilacji na samą górę ciała funkcji. Zobacz na przykładzie poniżej:

Przykład 1JavaScript
1
2
3
4
5
var height = 190;
 
size = size + height;
 
var size = 10;

Powyższy zapis po zinterpretowaniu przez przeglądarkę przyjmie następującą postać:

Przykład 2JavaScript
1
2
3
4
5
6
var height;
var size;
 
height = 190;
size = size + height;
size = 10;

Z tego powodu, bardzo często spotykaną praktyką jest deklarowanie zmiennych przez programistę na początku ciała funkcji. Dzięki temu w sposób jawny informujemy osobę, która czyta kod jakie zmienne są używane w kodzie. Zapobiegamy wtedy potencjalnym błędom wynikającym z ponownego zadeklarowania zmiennej czy też wynikającym z braku przejrzystości kodu, gdzie znaczniki var są porozsiewane w wielu miejscach w kodzie.

Wracając do let i const to różnica między nimi a var polega na zasięgu zmiennych. O ile var ma zasięg funkcyjny i występuje hoisting, to o tyle let i const mają zasięg blokowy. Co to oznacza?

Oznacza to, że zmienne będą dostępne w danym bloku kodu i nie będzie występował hoisting. Spójrz na przykład poniżej:

Przykład 3JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
console.log('hoisting:check', check);
 
 
const check = 4;
 
if (true) {
    let check = 2;
 
    console.log('let:check', check);
}
 
console.log('const:check:1', check);
 
check = 3;
 
console.log('const:check:2', check);

Gdy uruchomisz powyższy kod to zauważysz błąd informujący o tym, że zmienna check nie została zadeklarowana. Świadczy to o braku hoistingu. Gdy usuniesz pierwszy console.log() i ponownie uruchomisz kod, to zobaczysz dwa wywołania console.log(). Pierwszy zwróci nam informację, że zmienna check ma wartość 2, a drugi pokaże informację, że zmienna ma wartość 4.

Jest to bardzo ważna informacja, ponieważ mówi nam, że za pomocą let zmieniliśmy wartość zmiennej tylko i wyłącznie wewnątrz bloku warunku if i poza blokiem wartość zmiennej pozostaje niezmieniona.

Trzeciego wywołania console.log() nie zobaczysz, ponieważ wystąpi błąd związany z niemożliwością przypisania nowej wartości do zmiennej zadeklarowanej za pomocą const. Czy to świadczy o tym, że zmienne raz zadeklarowane za pomocą const są stałe?

Otóż nie, zmienne zadeklarowane za pomocą const nie są stałe. Stałe są referencje do zmiennych. To znaczy, nie możesz podmienić wartości w takiej zmiennej, jeśli jej wartość jest typu Boolean, String, Function czy Number, ale jest możliwość zmiany zawartości zmiennej jeśli jej wartość jest tablicą bądź obiektem. Gdy modyfikujemy tablicę czy obiekt, referencja do tej zmiennej pozostaje niezmieniona mimo zmiany zawartości tablicy/obiektu. Spójrz na przykład poniżej:

Przykład 4JavaScript
1
2
3
4
5
6
7
8
const names = [];
const person = {};
 
person.name = 'Piotr';
names.push('Nalepa');
 
console.log('names', names);
console.log('person', person);

Zadeklarowaliśmy zmienne za pomocą const i zmodyfikowaliśmy zawartość tablicy ze zmiennej names i obiektu ze zmiennej person. Taka manipulacja nie wywołała żadnego błędu w konsoli i jesteśmy w stanie zobaczyć rezultaty wywołań console.log().

Sekcja 1Podsumowanie

Celem tego wpisu było ukazanie różnic pomiędzy var a let i const. Jestem przekonany, że po przeczytaniu tego wpisu będziesz w stanie w sposób swobodny korzystać z nowych funkcjonalności.

Na koniec dodam jeszcze, że pisząc nowy kod w większości przypadków będziesz potrzebować wyłącznie const. Deklaracja zmiennych za pomocą let występuje znacznie rzadziej, najczęściej w różnego rodzaju pętlach.

Ten wpis otwiera nową serię wpisów dotyczących najnowszych standardów JavaScript. W kolejnych odcinkach możesz się spodziewać jeszcze większej ilości informacji na temat ES6.

Udostępnij
Uwagi

O autorze

Staff Software Engineer

Piszę na tym blogu od 2009 roku, a strony i aplikacje webowe tworzę zawodowo od 14 lat. Obecnie w Bishop Fox prowadzę frontend platformy Cosmos, od samego początku projektu. Wcześniej pracowałem m.in. w OLX, KUDO, Auto1 i eZ Systems. Piszę tu o tym, czego nauczyłem się w praktyce: o JavaScripcie, TypeScripcie, Reakcie, CSS-ie i architekturze frontendu. Występowałem też jako prelegent na konferencjach w Polsce i Europie. Masz pytanie albo pomysł na wpis? Daj znać!