Zamke IIFE u JavaScript-u

Hajde da pogledamo dva isečka koda.

Prvi:

javascriptlet result = 1
+function() {
  return 2;
}();

console.log(result);

Drugi:

javascriptlet 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:

javascriptlet 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:

javascript// 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:

javascriptlet 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:

javascriptlet 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:

javascriptlet 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:

javascriptlet 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.