Zmiennie w JavaScript
1. Wprowadzenie
Zmienna to nazwana przestrzeń w pamięci, w której możemy przechowywać dane, takie jak liczby, teksty, obiekty czy funkcje. W JavaScript zmienne są jednym z najważniejszych elementów języka — pozwalają tworzyć dynamiczne programy, przechowywać stany aplikacji i manipulować danymi.
W przeciwieństwie do niektórych języków, JavaScript nie wymaga deklaracji typu danych przy tworzeniu zmiennej — typ przypisywany jest dynamicznie na podstawie wartości.
2. Deklarowanie zmiennych
Od wersji ES6 (ECMAScript 2015) w JavaScript mamy trzy sposoby deklaracji zmiennych:
var– stary sposób (ES5 i wcześniej)let– nowoczesny sposób, rekomendowanyconst– zmienna stała (niezmienny wskaźnik)
2.1 var – zmienne funkcyjne
Deklaracja zmiennej przy użyciu var:
Cechy:
- Ma zakres funkcyjny (function scope), a nie blokowy.
- Można ją ponownie zadeklarować w tym samym zakresie.
- Jest hoistowana (podnoszona) na początek zakresu.
- Może prowadzić do nieoczekiwanych błędów, dlatego nie jest już zalecana.
Przykład – problem z var:
2.2 let – nowoczesny sposób deklaracji
Wprowadzony w ES6. Najczęściej używany do deklaracji zmiennych, których wartość może się zmieniać.
Przykład:
Cechy:
- Ma zakres blokowy (block scope) – obowiązuje tylko wewnątrz
{}. - Nie można jej ponownie zadeklarować w tym samym zakresie.
- Jest hoistowana, ale nie można z niej korzystać przed inicjalizacją (tzw. temporal dead zone).
Przykład zakresu blokowego:
2.3 const – stałe (niemodyfikowalne referencje)
Używana do deklarowania zmiennych, które nie powinny być nadpisywane.
Przykład:
Cechy:
- Ma zakres blokowy (tak jak
let). - Musi być zainicjalizowana w momencie deklaracji.
- Nie można ponownie przypisać nowej wartości.
- Jednak w przypadku obiektów i tablic można modyfikować ich zawartość (ponieważ
constchroni tylko referencję, nie samą strukturę danych).
Przykład – modyfikacja obiektu:
3. Hoisting – „podnoszenie” zmiennych
JavaScript przesuwa deklaracje zmiennych na górę swojego zakresu (funkcji lub skryptu) w trakcie interpretacji kodu.
Przykład z var:
Tutaj deklaracja var a została „podniesiona” na górę, ale przypisanie (a = 10) już nie.
Przykład z let i const:
Zmienna b istnieje, ale znajduje się w tzw. temporal dead zone — nie można z niej korzystać przed jej inicjalizacją.
4. Zakres zmiennych (scope)
Zakres określa, gdzie zmienna jest widoczna i dostępna w kodzie.
4.1 Zakres globalny
Zmienna dostępna w całym skrypcie.
4.2 Zakres funkcyjny
Zmienne zadeklarowane wewnątrz funkcji są dostępne tylko w niej.
4.3 Zakres blokowy
Dotyczy let i const – zmienne są dostępne tylko w obrębie bloku {}.
5. Zasady nazewnictwa zmiennych
Zmienna powinna mieć nazwę opisującą jej zawartość lub przeznaczenie. Przy tym musisz przestrzegać kilku zasad składniowych:
Dozwolone znaki:
- litery (A–Z, a–z), cyfry (0–9),
$,_ - nie może zaczynać się od cyfry
Niedozwolone:
- spacje, myślniki (
-), znaki specjalne (@,#, itp.)
Przykłady poprawne:
Złe przykłady:
Konwencja nazewnicza: W JavaScript stosuje się camelCase:
6. Różnice między var, let i const
| Cechy | var |
let |
const |
|---|---|---|---|
| Zakres | funkcyjny | blokowy | blokowy |
| Hoisting | tak (bez inicjalizacji) | tak (z temporal dead zone) | tak (z temporal dead zone) |
| Ponowne przypisanie | ✅ tak | ✅ tak | ❌ nie |
| Ponowna deklaracja | ✅ tak | ❌ nie | ❌ nie |
| Inicjalizacja wymagana | ❌ nie | ❌ nie | ✅ tak |
| Użycie w nowych projektach | ❌ niezalecane | ✅ zalecane | ✅ zalecane (dla stałych) |
7. Zmienne globalne i obiekt window / globalThis
W przeglądarce zmienne zadeklarowane poza funkcjami trafiają do obiektu globalnego window:
W nowoczesnych środowiskach (np. Node.js, przeglądarki ES2020+) można używać:
Uwaga: unikanie zmiennych globalnych jest dobrą praktyką – mogą prowadzić do konfliktów nazw.
8. Stałe a niezmienność danych
const chroni referencję zmiennej, ale niekoniecznie jej zawartość.
Dla prostych typów (number, string, boolean) wartość jest naprawdę stała.
Dla obiektów i tablic – referencja nie może się zmienić, ale dane wewnątrz już tak.
Przykład:
9. Dobre praktyki przy pracy ze zmiennymi
- Używaj
leticonst, unikajvar. - Stosuj
constzawsze, gdy zmienna nie ma być modyfikowana. - Używaj czytelnych i opisowych nazw zmiennych.
- Deklaruj zmienne jak najbliżej miejsca ich użycia.
- Unikaj zmiennych globalnych, jeśli nie są absolutnie konieczne.
- Pamiętaj o zakresach blokowych – nie używaj zmiennych poza ich blokiem.
- Unikaj zjawiska shadowingu (nadpisywania zmiennych o tej samej nazwie w wewnętrznym zakresie).
Przykład shadowingu:
10. Podsumowanie
| Cecha | var |
let |
const |
|---|---|---|---|
| Zakres | Funkcyjny | Blokowy | Blokowy |
| Hoisting | Tak (z undefined) |
Tak, ale niedostępna przed inicjalizacją | Tak, ale niedostępna przed inicjalizacją |
| Ponowne przypisanie | ✅ Tak | ✅ Tak | ❌ Nie |
| Ponowna deklaracja | ✅ Tak | ❌ Nie | ❌ Nie |
| Zalecane użycie | ❌ Stary kod | ✅ Zmienna, której wartość się zmienia | ✅ Stałe wartości lub referencje |
11. Wnioski
- JavaScript jest dynamicznie typowanym językiem, a zmienne mogą zmieniać typ w czasie działania programu.
leticonstwprowadziły bardziej przewidywalne i bezpieczne zarządzanie zmiennymi.- Unikaj
var, jeśli nie musisz wspierać bardzo starych przeglądarek. - Używaj
constjako domyślnej opcji, alettylko wtedy, gdy wartość ma być modyfikowana. - Pamiętaj o zakresie blokowym i hoistingu, aby uniknąć trudnych do wykrycia błędów.
Podsumowanie praktyczne:
- W nowoczesnym JavaScript (ES6+), zawsze zaczynaj od const, zmieniaj na let, tylko jeśli faktycznie potrzebujesz zmienić wartość.
- Taka zasada sprawi, że Twój kod będzie czystszy, bardziej przewidywalny i odporny na błędy.