Zamke IIFE u JavaScript-u
Hajde da pogledamo dva isečka koda.
Prvi:
let result = 1
+function() {
return 2;
}();
console.log(result);
Drugi:
let result = 1;
+function() {
return 2;
}();
console.log(result);
Ova dva isečka koda su skoro identična,
ali ako se pokrenu - rezultat će se razlikovati.
Prvi kod će ispisati u konzolu broj 3,
a drugi - broj 1.
Zašto je došlo do takve razlike: stvar je u tome što u jednom slučaju na kraju prve linije koda nedostaje tačka-zarez, a u drugom slučaju - prisutan je.
Možete se zapitati: kako to, pa u JavaScript-u tačka-zarez na kraju komande nije obavezna! U stvari to nije sasvim tako. Hajde da shvatimo šta se zapravo dešava.
Prvi kod se može prepisati ovako:
let result = 1 + function() {
return 2;
}();
console.log(result); // ispisaće 3
Sada odmah postaje očigledno da se
jedinici dodaje rezultat poziva funkcije
na licu mesta, to jest 2. Zbog toga će konačni
rezultat biti 3.
Ako se iza jedinice stavi tačka-zarez, onda će kod biti drugačije shvaćen od strane interpretera:
// Prva komanda:
let result = 1;
// Druga komanda:
+function() {
return 2;
}();
// Treća komanda:
console.log(result); // ispisaće 1
To jest, dodela u promenljivu i poziv funkcije na licu mesta postaće različite komande. A sve zbog prisustva tačka-zareza!
Ispada da u ovom slučaju poziv funkcije
na licu mesta uopšte ništa ne radi - jednostavno
u ništa vraća broj 2, koji
nikako ne utiče na promenljivu result.
Hajde onda da shvatimo, a zašto uopšte možemo da ne pišemo tačka-zarez u JavaScript-u. Neka imamo ovakav kod bez tačka-zareza:
let result = 1 // u result će se upisati 1
let test = 2 // u test će se upisati 2
On radi ispravno, pošto je interpreter sam stavio na kraju svake linije tačka-zarez.
Ali pogledajte ovakav kod:
let result = 1
+ 2; // u result će se upisati 3
Sada se tačka-zarez na kraju prve linije neće automatski postaviti, pošto interpreter razume da je komanda druge linije - to deo komande prve linije.
Ali ako mi sami stavimo tačka-zarez - rezultat će biti potpuno drugačiji:
let result = 1; // u result će se upisati 1
+ 2; // komanda ne radi ništa, ali neće biti ni greške
Ispada da interpreter sam stavlja tačka-zarez, samo ako sledeća komanda nije deo prethodne.
A sada pogledajte ovaj kod:
let result = 1
+function() {
return 2;
}();
console.log(result);
Zaista, druga linija - je samo nastavak komande prve linije i interpreter ne stavlja tačka-zarez automatski. Upravo zato, ako mi sami napišemo tačka-zarez na kraju prve linije - rezultat će biti potpuno drugačiji. Ovo govori o tome da je najbolje uvek staviti tačka-zarez na potrebnim mestima, kako bismo izbegli probleme.