Oblast važenja u JavaScriptu

Oblast važenja (engl. scope) predstavlja "domen" u kome važe promenljive i funkcije. Ovo ne znači da će unutar svog domena promenljive obavezno biti definisane (tj. da će imati vrednost), već samo "važenje".

U JavaScript-u se oblast važenja promenljive definiše isključivo funkcijom. Dakle, ona funkcija u kojoj je promenljiva definisana pomoću reči var, predstavlja prostor u kome ta promenljiva ima važenje.

Što više budete napredovali u JavaScript-u, razvijaćete stil programiranja kod koga definišete funkcije unutar funkcija. Promenljive definisane u spoljašnjim funkcijama imaju važenje i u svim unutrašnjim funkcijama, osim ako ih unutrašnje funkcije ne "pokriju" svojim lokalnim promenljivama (promenljive istog naziva).

var promenljiva = [vrednost]; // važi globalno i van i unutar funkcije function fun() { var promenljiva = [vrednost]; // važi unutar funkcije }

Lokalne promenljive (i unutrašnje funkcije) dostupne su samo u okviru funkcije unutar koje su definisane. Ovo može da se prevaziđe ako se unutrašnja funkcija referencira van svoje funkcije čime se kreira closure. O ovome će biti više reči kasnije.

Primer

Ovde imamo prilično čistu situaciju. Jednu globalnu i jednu lokalnu promenljivu.


	var x = 10;  // važi globalno
	function fun() 
	{
	    var y = 5;  // važi samo lokalno
	    console.log(x + y);  // 15 - u funkciji važi i globalna i lokalna promenljiva
	}
    console.log(x + y);  // NEDEFINISANO - van funkcije važi samo globalna promenljiva
		

Evo malo drugačijeg primera, kada lokalna promenljiva pokriva globalnu. Ovo se dešava kada i globalna i lokalna promenljiva imaju isto ime.


	var x = 10;  // važi globalno
	function fun() 
	{
	    var y = 5;  // važi samo lokalno
	    var x = 20; // promenljiva x pokriva globalnu promenljivu x
	    console.log(x + y);  // 25 - u funkciji važe lokalne promenljive
	}
		
js-basic-scope-sr

Oblast važenja funkcije

Funkcija može biti deklarisana na globalnom nivou ili lokalno (unutar neke druge funkcije). Ako je deklarisana globalno (znači van svih drugih funkcija) i njeno važenje će biti globalno. Takvu funkciju možemo pozivati bilo gde u programu.

Ako je funkcija definisana lokalno (unutar druge funkcije) imaće važenje bilo gde unutar svoje nadfunkcije. To znači i unutar drugih podfunkcija i to nezavisno da li se poziva pre ili posle deklaracije. Ovo je moguće zahvaljujući osobini JavaScripta koja se zove hoisting.

Primer

Ovo je nešto što spada u same osnove JavaScripta. Obratite pažnju na to gde je funkcija važeća a gde nije.


  function globalna()
  {
    console.log("Pozvana globalna funkcija");
  }
  
  function nadfun()
  {
    lokal(1);  // pozivamo f-ju lokal() pre deklaracije
    
    function lokal(param) // deklaracija funkcije lokal()
    {
      console.log(param)
    }
    
    lokal(2);  // pozivamo f-ju lokal() posle deklaracije
    
    function mini()  // podfunkcija mini()
    {
      lokal(3);  // unutar podfunkcije takođe možemo pozvati f-ju lokal() - sve je to i dalje unutar nadfun()
      globalna();  // f-ja globalna() je svuda važeća
    }
  }
  
  lokal(4);  // ovo neće raditi - lokal() nema važenje van svoje nadfunkcije
		

Ako imate iskustva u drugim jezicima, možda vam je čudno da već sada naglašavamo da je moguće deklarisanje unutrašnjih funkcija, ali u JavaScriptu je to tehnika koju često koristimo. Za razliku od drugih jezika, oblast važenja nije definisana unutar modula ili bloka. Jedini način da odvojimo funkcije da ne smetaju jedna drugoj je da ih smestimo unutar drugih funkcija.

Svi elementi sajta Web'n'Study, osim onih za koje je navedeno da su u javnom vlasništvu, vlasništvo su autora i ne smeju se koristiti, u celosti ili delimično bez pismenog odobrenja autora. To uključuje tekstove, slike, ilustracije, animacije, prateći grafički materijal i programski kod.
Ovaj sajt koristi tehnologiju kolačića (cookies). Detaljnije o tome možete pročitati u tekstu o našoj politici privatnosti.