Hoisting, czyli wynoszenie, to zachowanie JavaScript, które polega na przenoszeniu deklaracji zmiennych i funkcji na początek zakresu przed wykonaniem kodu. W praktyce oznacza to, że zmienne i funkcje można używać przed ich deklaracją w kodzie. Jest to możliwe, ponieważ JavaScript podczas fazy kompilacji przesuwa wszystkie deklaracje zmiennych (z var
) i deklaracje funkcji na początek zakresu. Warto jednak pamiętać, że hoisting zachowuje się inaczej dla zmiennych zadeklarowanych za pomocą let
i const
.
Przykłady hoistingu
Poniżej znajduje się kompletny plik HTML z kodem JavaScript ilustrującym różne przypadki hoistingu.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hoisting w JavaScript</title>
</head>
<body>
<h3>Przykłady hoistingu w JavaScript</h3>
<script>
// Przykład 1: Hoisting funkcji
console.log(sum(5, 3)); // Wywołanie funkcji przed jej deklaracją
function sum(a, b) {
return a + b; // Funkcja jest dostępna dzięki hoistingu
}
// Przykład 2: Hoisting zmiennych zadeklarowanych za pomocą 'var'
console.log(number); // undefined, ale nie ma błędu referencji
var number = 10; // Zmienna 'number' jest hoistowana, ale jej wartość nie
// Przykład 3: Hoisting zmiennych zadeklarowanych za pomocą 'let' i 'const'
// console.log(anotherNumber); // Błąd referencji, 'anotherNumber' nie jest dostępna
let anotherNumber = 20; // Zmienna 'anotherNumber' nie jest hoistowana
// Przykład 4: Hoisting w kontekście bloku
if (true) {
// console.log(blockScoped); // Błąd referencji, 'blockScoped' nie jest dostępna
const blockScoped = "jestem w bloku"; // 'const' i 'let' mają zakres blokowy
}
</script>
</body>
</html>
Opis przykładów
- Przykład 1 pokazuje, że funkcje są w pełni hoistowane, co pozwala na ich wywoływanie przed fizyczną deklaracją w kodzie.
- Przykład 2 ilustruje, jak zmienna deklarowana za pomocą
var
jest hoistowana. Dostępna jest jakoundefined
przed przypisaniem jej wartości. - Przykład 3 demonstruje, że zmienne deklarowane za pomocą
let
iconst
także podlegają hoistingowi, ale nie są dostępne przed deklaracją w kodzie. Dostęp do nich przed ich deklaracją skutkuje błędem referencji. - Przykład 4 wskazuje, że hoisting działa również w zakresie blokowym, ale zmienne z
let
iconst
nie są dostępne przed deklaracją wewnątrz bloku.
Podsumowanie
Hoisting jest unikalną cechą JavaScript, która pozwala na większą elastyczność w pisaniu kodu. Jednak wymaga to także dokładnego zrozumienia, jak i kiedy można bezpiecznie korzystać z hoistowanego kodu, zwłaszcza przy używaniu let
i const
, które mają inne zachowanie niż var
. Zrozumienie hoistingu pomaga unikać błędów związanych z niezdefiniowanymi zmiennymi i pozwala pisać bardziej przewidywalny oraz czytelny kod.
Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs JavaScript od podstaw w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.