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())