JavaScript je pun nepredvidivih ponašanja, osobito kada govorimo o njegovom "event loop"-u, koji je ključan za asinkrono programiranje. U ovom članku istražujemo neobične aspekte ovog jezika i pružamo savjete o tome kako ih iskoristiti za poboljšanje vaših programerskih vještina.
Event loop u JavaScriptu je srž onoga što ga čini jedinstvenim. To je mehanizam koji omogućuje JavaScript-u da radi asinkrone operacije, pružajući jedinstven model događaja. Kako to funkcionira? Kada se dogodi neki događaj, kao što je klik na gumb ili povratna informacija sa servera, event loop preuzima taj događaj i stavlja ga u red čekanja. Ovo omogućava da se ostali kod (sindikalno poznat kao "call stack") izvršava bez prekida.
Jedna od najinteresantnijih neobičnosti jest kako JavaScript rukuje zadacima koji uključuju različite razine hitnosti. Na primjer, kada koristimo setTimeout, možda ćemo očekivati da se kod unutar njega izvrši odmah nakon isteka vremena, no JavaScript zapravo stavlja te zadatke u "macrotask queue". To znači da će se izvršiti tek nakon što se završi trenutni call stack, neovisno o tome koliko vremena prođe.
Pogledajmo primjer. Ako pišete sljedeći JavaScript kod:
console.log("Prvo");
setTimeout(() => console.log("Drugo"), 0);
console.log("Treće");
Rezultat će biti:
Prvo Treće Drugo
Ovo ponašanje može zbuniti nove programere i često izaziva mnogo pitanja. Zašto se "Drugo" ne ispisuje odmah nakon "Prvo"? Odgovor leži u tome što JavaScript prvo obrađuje sve zadatke iz call stack-a, a zatim prelazi na zadatke iz "macrotask queue".
Što se događa kada se pokušate oslanjati na redoslijed izvršavanja? To dovodi do asinkrone paranoje, osjećaja nesigurnosti i stresa koji programeri često doživljavaju. U istraživanju provedenom među programerima na platformama poput Stack Overflow, 45% anketiranih naglasilo je da im asinkroni kod često izaziva glavobolje. Čak i iskusniji programeri priznaju da su se osjećali kao da im izmiče tlo pod nogama zbog nepredvidivih ponašanja event loop-a.
Još jedna zanimljivost u JavaScriptu su "closures". To su funkcije koje zapamte svoje okruženje, čak i kada su izvan konteksta. Kada dekonstruiramo njihovo ponašanje u asinkronim situacijama, možemo naići na komične, ali i zbunjujuće situacije. Na primjer:
function createCounter() {
let count = 0;
return function() {
count++;
console.log(count);
}
}
let counter = createCounter();
setTimeout(counter, 1000); // Ispravni izlaz: 1
setTimeout(counter, 2000); // Ispravni izlaz: 2
U ovom slučaju, closures omogućuju da svaki put kada je counter pozvan, on zapamti svoju prethodnu vrijednost, iako je pozvan asinkrono.
Razumijevanje event loop-a može dramatično poboljšati vašu sposobnost optimizacije performansi. Kada znate kako JavaScript upravlja asinkronim zadacima, možete izbjeći neke sljedeće zamke:
Zamislite svijetske vojne, gdje vojnici (zadatci) čekaju da pređu most (event loop) prije nego što nastave prema svom cilju. Sami vojnici izlaze na teren, ali mogu biti zatvoreni jer trebaju čekati na most. Kada most postane slobodan, vojnici mogu preći, bez obzira na to koliko je vremena prošlo.
Ovaj koncept pomaže razjasniti kako JavaScript upravlja događajima i zadacima, i pomaže u uklanjanju konfuzije oko toga zašto neki zadaci imaju prioritet nad drugima.
Prema nedavnom istraživanju koje je provela tvrtka NodeSource, više od 60% programera smatra da je asinkrono programiranje jedan od najtežih aspekata JavaScript-a. S druge strane, 75% programera izjavljuje da su se suočili s problemima u upravljanju asinhronim operacijama.
S druge strane, nije sve tako mračno! Ponekad se sretnete s situacijama kada stvorite funkciju koja nikada ne prestaje izvoditi. Na primjer:
let counter = 0;
function neverEnding() {
console.log(counter++);
setTimeout(neverEnding, 0);
}
neverEnding();
Iako može biti korisno u specifičnim situacijama, ovi "neprekidni" ciklusi mogu biti izvor smijeha kada vidite koliko brzo se vaš broj povećava, ali i frustracija kada shvatite koliko resursa troši!
S obzirom na sve ove neobične i ponekad zabavne aspekte JavaScript event loop-a, važno je uzeti si vremena da razumijete kako to funkcionira. Kao mladi programer, možda ćete se s pridružiti neprekidnom kružoku pitanja, ali s vremenom i praksom, shvatit ćete da je taj nepredvidiv svijet JavaScript-a samo još jedan dio vašeg programerskog putovanja.
Kroz svoj put, družite se s ljudima koji dijele vašu strast prema programiranju, postavljajte pitanja i duboko istražujte. Naći ćete da, bez obzira koliko bili čudni ili iznenađujući, event loop i JavaScript su jednostavno dio prekrasnog složenog svijeta programiranja.