W JavaScript
var i
let to słowa kluczowe, które są używane do deklaracji zmiennych, ale mają kilka różnic w zachowaniu.
Zakres widoczności
var ma zakres widoczności na poziomie funkcji (function-scoped). Oznacza to, że zmienne zadeklarowane przy użyciu
var są zdefiniowane w ramach funkcji i nie są dostępne poza nią.
function example() {
if (true) {
var x = 10;
console.log(x); // dostępne
}
console.log(x); // dostępne
}
let ma blokowy zakres widoczności (block-scoped), co oznacza, że jest zdefiniowane w bloku kodu (np. w instrukcjach warunkowych lub pętlach) i nie jest dostępne poza ich granicami.
function example() {
if (true) {
let y = 20;
console.log(y); // dostępne
}
console.log(y); // niedostępne
}
Podnoszenie (hoisting)
Zmiennie zadeklarowane za pomocą
var są podnoszone (hoisted) na górę funkcji lub obiektu globalnego, co oznacza, że można ich używać przed ich faktyczną deklaracją.
console.log(a); // undefined
var a = 5;
console.log(a); // 5
Zmiennie zadeklarowane za pomocą
let również są podnoszone, ale nie można ich używać przed ich deklaracją.
console.log(b); // ReferenceError: b is not defined
let b = 10;
console.log(b); // 10
Czemu preferuje się let?
Blokowy zakres widoczności:
Pozwala uniknąć nieprzewidywalnych sytuacji, gdy zmienne zadeklarowane za pomocą var mogą być używane poza blokami.
Brak problemów z podnoszeniem (hoisting):
Zmiennie zadeklarowane za pomocą
let również są podnoszone, ale ich użycie przed deklaracją skutkuje ReferenceError. Ułatwia to zrozumienie kodu, ponieważ zmienne nie mają wartości undefined, dopóki nie zostaną im przypisane wartości.
Zmniejszenie konfliktów nazw:
Użycie
let może pomóc uniknąć sytuacji, w których w kodzie występują konflikty z powodu ponownego użycia nazw zmiennych. Ponieważ
let ma blokowy zakres widoczności, pozwala na użycie tej samej nazwy dla zmiennych w różnych blokach kodu bez konfliktów.
Łatwiejsze błędy w czasie wykonania:
Użycie let może prowadzić do bardziej zrozumiałych błędów w czasie wykonania kodu. Na przykład, próba użycia zmiennej przed jej deklaracją spowoduje ReferenceError, co ułatwia wykrywanie błędów.
Czystość kodu:Nowoczesne lintery preferują
let jako bardziej niezawodną i przewidywalną opcję deklaracji zmiennych. Na przykład, istnieje linter (linter) dla JavaScript, który nazywa się "eslint" i ma regułę o nazwie "no-var". Ta reguła ma na celu wykrywanie użycia słowa kluczowego
var w kodzie i zalecanie jego zastąpienia nowocześniejszymi słowami kluczowymi, takimi jak
let lub
const.