Reference na JavaScript funkcije
Sada morate obratiti pažnju na jako bitnu stvar. Već smo pomenuli reference kada smo se upoznali sa objektima. Zapamtite: u JavaScriptu su čak i funkcije objekti! To znači da možemo imati i reference na funkcije - promenljive koje "pokazuju" na funkcije koje se nalaze "negde u memoriji".
Zahvaljujući tome funkcije se mogu prosleđivati kao parametri ili vraćati kao rezultati. Ovo su tzv. lambda funkcije. Ovome ćemo se vratiti kada budemo detaljnije proučavali funkcije.
Ono što nas trenutno zanima je sledeće: ako funkciju uvedemo u program preko reference, ona će biti definisana kao promenljiva (referenca) a neće važiti kao funkcija.
Referenca na funkciju
Šta se dešava kada funkciju uvedemo preko reference?
function f()
{
fun(2, 5); // GREŠKA - referenca fun ovde nije definisana (funkcija bi bila)
// nemojte se zavarati - ovo nije funkcija fun, već anonimna funkcija
// za koju nas vezuje referenca (promneljiva) fun
// - iako funkciju pozivamo sa fun(), to nije zaista naziv funkcije
var fun = function(a, b)
{
console.log(a+b);
}
fun(10, 15); // poziv funkcije fun() posle njene deklaracije je U REDU
}
fun(1, 2); // GREŠKA - očekivano, funkciju ne možemo pozvati van njene oblasti važenja
Reference nisu moguće samo za anonimne, već i imenovane funkcije. Ako kreirate funkciju unutar izraza dodele, ne očekujte da je možete pozvati po njenom imenu, već samo preko reference.
Zašto onda na ovaj način uopšte deklarišemo imenovane funkcije? Jednostavno, praktično je ako je tu funkciju potrebno rekurzivno pozivati.
Referenca na imenovanu funkciju
function f()
{
// referenca fun na imenovanu funkciju fakt()
// iako tako izgleda, ovo nije klasična funkcija - uvedena je u program putem izraza dodele
var fun = function fakt(a)
{
if (a == 0) return 1;
return a * fakt(a-1); // rekurzivan poziv fukncije fakt()
}
fun(5); // poziv funkcije preko reference fun() je U REDU
fakt(5); // poziv funkcije preko preko njenog imena je GREŠKA
}
Samo da potvrdimo još jednu sitnicu. Referencu je moguće kreirati i na običnu funkciju.
Referenca na funkciju
Kada deklarišemo funkciju, na nju je takođe moguće kreirati referencu.
function f()
{
fun(2, 5); // GREŠKA - referenca fun ovde nije definisana
zbir(2, 5); // U REDU - funkcija je važeća
var fun = zbir; // referenca fun na funkciju zbir()
function zbir(a, b) // deklarišemo i funkciju zbir
{
console.log(a+b);
}
fun(10, 15); // U REDU
zbir(10, 15) // U REDU
}
fun(1, 2); // GREŠKA - očekivano, funkciju preko reference ne možemo pozvati van njene oblasti važenja
zbir(1, 2); // GREŠKA - to važi i za funkciju