JavaScript hoisting

Hoisting je termin koji označava kako JavaScript tretira deklaracije promenljivih i funkcija. Već smo se upoznali sa time kako funkcioniše oblast važenja. Ako želimo da promenljiva bude lokalna unutar funkcije, moramo je deklarisati u funkciji sa var. isto važi i za lokalne funkcije, "sakrivene" unutar veće funkcije.

Hoisting promenljivih

Ako promenljiva nije deklarisana sa var, već joj samo dodelimo vrednost ili je upotrebimo, podrazumevaće se da je u pitanju globalna promenljiva. Što je program kompleksniji, ovo može predstavljati veći problem i generisati veći broj grešaka.

Hoisting jednostavno znači, da nije bitno na kom mestu unutar funkcije deklarišemo promenljivu, ona će imati važenje unutar te funkcije. Ipak, ne zaboravite - promenljiva će biti nedefinisana (undefined) sve dok joj se ne dodeli vrednost, što znači da će suštinski biti neupotrebljiva dok se i ne definiše, ali bar neće biti "globalizovana".

Hoisting promenljive

Pogledajmo kako hoisting promenljive funkcioniše u praksi.


  var y = 100;  // globalno y
  
  function fun()
  {
    var x = 10;  // deklaracija i definicija promenljive x na početku - ovo se preporučuje

    console.log(y);  // y je nedefinisano - ne koristi se globalno y jer je deklaracija hoistovana

    y = 5;  // definicija promenljive y - da nema hoistinga, globalno y bi sada dobilo novu vrednost

    console.log(x+y);  // u konzoli ispisuje 15
    
    var y;  // deklaracija promenljive y zahvaljujući hoistingu važi kroz celu funkciju
  }
		

Hoisting funkcija

Zahvaljujući hoistingu, funkcije možemo pozvati i pre i posle njihove deklaracije. Ovo će izgledati čudno programerima koji dolaze iz mnogo strožih jezika (npr. Pascal), gde se tačno zna na kom mestu se deklarišu procedure i funkcije u programu. JavaScript dozvoljava da se funkcije deklarišu gde god nam odgovara, a možemo ih pozivati kroz celu oblast važenja.

Hoisting funkcije

Hoisting funkcija je već malo lakše razumeti.


  function f()
  {
    fun(2, 5);  // poziv funkcije fun() pre njene deklaracije
    
    function fun(a, b)  // deklaracija funkcije fun
    {
      console.log(a+b);
    }

    fun(10, 15);  // poziv funkcije fun() posle njene deklaracije
  }
  
  fun(1, 2);  // GREŠKA - funkcija fun() nije definisana van svoje oblasti važenja (funkcije f())
		
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.