Słowo kluczowe var
w JavaScript jest używane do deklarowania zmiennych przed wprowadzeniem ES6, które wprowadziło let
i const
. Chociaż var
wciąż jest częścią języka, ważne jest zrozumienie jego zachowania i różnic w zakresie w porównaniu do let
i const
.
Zakres zmiennej zadeklarowanej przez var
Zmienne zadeklarowane przez var
mają zakres funkcyjny (function scope) lub są traktowane jako globalne, jeśli nie zostały zadeklarowane wewnątrz funkcji. Oznacza to, że zmienna jest dostępna w całej funkcji, bez względu na bloki kodu, w których została zadeklarowana.
function exampleFunction() {
if (true) {
var functionScopedVariable = "Dostępna w całej funkcji";
}
console.log(functionScopedVariable); // "Dostępna w całej funkcji"
}
exampleFunction();
// console.log(functionScopedVariable);
// Błąd: functionScopedVariable is not defined, bo
// nie ma dostępu do zmiennej var gdyż ma zakres funkcyjny
W przeciwieństwie do let
i const
, które mają zakres blokowy, zmienne zadeklarowane za pomocą var
nie są ograniczone do bloku w pętlach czy instrukcjach warunkowych. Oznacza to, że zmienne te są dostępne poza blokami, w których zostały zadeklarowane, jeśli znajdują się w tym samym zakresie funkcji lub są globalne.
Przykład w pętli
Poniższy przykład ilustruje, jak zmienna zadeklarowana przez var
w pętli for
zachowuje się po zakończeniu pętli:
for (var i = 0; i < 3; i++) {
console.log("Wewnątrz pętli: i = " + i);
}
console.log("Poza pętlą: i = " + i); // i jest dostępne poza pętlą
!!! // Wynik w konsoli: // Wewnątrz pętli: i = 0 // Wewnątrz pętli: i = 1 // Wewnątrz pętli: i = 2 // Poza pętlą: i = 3
Jest to bardzo ważne zachowanie var, przez co powoduje błędy gdy korzystają z niego niedoświadczeni programiści, dlatego zaleca się używanie obecnie wyłącznie let i const, gdyż nie mają tego problemu.
Podobnie var zachowa się z instrukcją if, też zmienna z var nie będzie miała zakresu blokowego
if (true) {
var conditionVar = "Zmienna z instrukcji warunkowej";
}
console.log(conditionVar); // Dostępne również poza instrukcją warunkową
Gdybyśmy użyli let
lub const
zamiast var
, zmienne te miałyby zakres blokowy, co oznacza, że nie byłyby dostępne poza blokiem, w którym zostały zadeklarowane:
if (true) {
let blockScopedLet = "Jestem w zakresie blokowym";
const blockScopedConst = "Ja również";
}
// console.log(blockScopedLet); // Błąd: blockScopedLet is not defined
// console.log(blockScopedConst); // Błąd: blockScopedConst is not defined
Podsumowanie
Brak zakresu blokowego dla zmiennych zadeklarowanych za pomocą var
podkreśla, dlaczego w nowoczesnym JavaScript zaleca się stosowanie let
i const
dla lepszej kontroli nad zakresem zmiennych. Używanie let
i const
zapewnia większą klarowność kodu, ograniczając widoczność zmiennych do bloków, w których są one faktycznie potrzebne i używane.
Jeżeli chcesz przyśpieszyć swoją naukę chciałbym polecić mój kurs video JavaScript w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.