Zmienne, typy i ich zakresy widzialności w Java Script
W języku Java Script zmienne nie posiadają wyraźnie określonego typu, a ich zakres widzialności (ang. scope) jest zależny od miejsca i sposobu zadeklarowania. Dla przypomnienia zadeklarowanie zmiennej jest de facto miejscem pierwszej inicjacji zmiennej. Z różnymi typami danych wiążą się różne niuanse związane z operatorami szczególnie logicznymi i porównania, ale jest to odrębny temat.
Zmienne mogą przechowywać różne typy wartości (proste i referencyjne), a ich aktualny typ możemy dokładniej określić posługując się operatorem typeof zwracającym łańcuch znakowy oznaczający nazwę typu.
- “undefined” - jeśli wartość jest typu nieokreślonego co ma miejsce gdy zmiennej nie nadano jeszcze żadnej wartości lub jawnie ją usunięto
- “boolean” - gdy wartość jest typu logicznego
- “number” - gdy wartość jest typu liczbowego (niezależnie czy całkowity czy rzeczywisty)
- “string” - gdy wartość jest łańcuchem znakowym
- “object” - gdy wartość jest referencją lub typem Null
- “function” - gdy wartość jest wskaźnikiem do funkcji
Niestety ma on kilka wad:
- nie rozróżnia obiektów (dla dowolnego obiektu zwracana jest wartość “object”)
- jeśli zmienna ma wartość Null to operator ten także zwróci wartość “object”
- niekiedy może wystąpić problem z rozróżnieniem funkcji i obiektu, bo funkcje to też są w zasadzie obiekty (tzw. obiekty funkcyjne).
Oprócz tego możemy także korzystając z operatora instanceof sprawdzić czy zmienna jest obiektem określonego typu.
A teraz troszkę o zakresach. Istnieje globalny zakres widzialności zmiennej, oraz zakres lokalny w ciele funkcji. Wewnątrz funkcji można nie tylko dołożyć zmienną do lokalnego jej zakresu dostępności, ale także dodać jakąś zmienną do zakresu głównego. Różnica tkwi wyłącznie w użyciu lub nie słowa kluczowego var. Używając inicjacji zmiennej poprzedzając ją słowem var zaznaczamy ją do użytku tylko wewnątrz aktualnej funkcji. Podsumujmy zatem to co napisałem powyżej używając tej wiedzy w poniższym przykładzie, który pozwoli łatwiej zrozumieć zachodzące zależności.
global_var_1 = "test globalnej zmiennej #1"; // inicjacja pierwszej zmiennej globalnej
function func_1 () {
global_var_2 = "test globalnej zmiennej #2"; // inicjacja drugiej zmiennej globalnej (tym razem z poziomu scope'a funkcji)
}
function func_2 () {
var local_var_3 = "test zmiennej #3"; // ta zmienna będzie dostępna tylko w tej funkcji
}
alert(global_var_1); // "test globalnej zmiennej #1"
alert(global_var_2); // "test globalnej zmiennej #2"
alert(local_var_3); // BŁĄD! zmienna nie istnieje. Prawdą jest wyrażenie:typeof local_var_3 == "undefined"
Z opisanymi tu właściwościami deklarowanych w różny sposób zmiennych wiąże się inne bardzo ważne pojęcie, tzw. closures czyli domknięcia funkcji. Szerzej o tym napiszę, w następnej odsłonie, gdyż temat ten jest szeroki i będzie rozciągał się na tematykę obiektowości w języku JavaScript.
Do zobaczenia wkrótce, pozdrawiam.
Tags: instanceof, java script, scope, typ zmiennej, typeof, zakres widzialności, zmienna
Najświeższe komentarze