Blog programisty o C/C++ i PHP

Programowanie w C/C++ i PHP. Blog pełen wskazówek, porad, analiz i opisów.

Zmienne, typy i ich zakresy widzialności w Java Script

grudzień 22nd, 2009 in Programowanie 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: , , , , , ,

Leave a Reply