Marcin Stawowczyk · @m7rlin
1 min czytania ·
var
console.log(a); // undefined
var a = 5;
console.log(a); // 5
W tym przypadku deklaracja var a
jest hoistowana na początek zakresu, ale przypisanie wartości (= 5
) następuje dopiero w miejscu, gdzie zostało zapisane w kodzie. Dlatego pierwsze console.log(a)
wypisze undefined
.
let
console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 10;
Zmienne zadeklarowane przez let
również są hoistowane, ale nie są inicjalizowane. Przed linią deklaracji znajdują się w tzw. "martwej strefie czasowej" (temporal dead zone). Próba użycia takiej zmiennej przed deklaracją skutkuje błędem ReferenceError.
const
console.log(c); // ReferenceError: Cannot access 'c' before initialization
const c = 15;
Dla const
sytuacja jest identyczna jak dla let
: zmienna jest hoistowana, ale nie można jej użyć przed deklaracją - również pojawi się ReferenceError.
var
– deklaracja jest hoistowana, inicjalizacja nie; przed deklaracją zmienna ma wartość undefined
.
let
i const
– deklaracja jest hoistowana, ale zmienna nie jest dostępna przed deklaracją (ReferenceError).
Znajomość tych różnic pozwala unikać trudnych do wykrycia błędów w kodzie JavaScript.