Gropat e IIFE në JavaScript
Le të shqyrtojmë dy pjesë kodi.
E para:
let result = 1
+function() {
return 2;
}();
console.log(result);
E dyta:
let result = 1;
+function() {
return 2;
}();
console.log(result);
Këto dy pjesë kodi janë pothuajse identike,
por nëse ekzekutohen - rezultati do të jetë i ndryshëm.
Kodi i parë do të shfaqë në konsol numrin 3,
ndërsa i dyti - numrin 1.
Pse ndodhi një ndryshim i tillë: e gjitha ka të bëjë me faktin se në një rresht të parë të kodit mungon pikëpresja në fund, ndërsa në rastin e dytë - është e pranishme.
Mund të pyesni: si është e mundur, në fund të fundit në JavaScript pikëpresja në fund të komandës nuk është e detyrueshme! Në fakt kjo nuk është plotësisht e vërtetë. Le të kuptojmë se çfarë po ndodh në të vërtetë.
Kodi i parë mund të rishkruhet kështu:
let result = 1 + function() {
return 2;
}();
console.log(result); // do të shfaqë 3
Tani bëhet menjëherë e qartë se
në njësi i shtohet rezultati i thirrjes së funksionit
në vend, domethënë 2. Prandaj rezultati
përfundimtar do të jetë 3.
Nëse vendoset pikëpresje pas njësies, kodi do të perceptohet nga interpretuesi ndryshe:
// Komanda e parë:
let result = 1;
// Komanda e dytë:
+function() {
return 2;
}();
// Komanda e tretë:
console.log(result); // do të shfaqë 1
Domethënë, caktimi në variabël dhe thirrja e funksionit në vend do të bëhen komanda të ndryshme. Dhe e gjitha për shkak të pranisë së pikëpresjes!
Rezulton se në këtë rast thirrja e funksionit
në vend nuk bën asgjë - thjesht
kthen numrin 2 në hiç, i cili
nuk ndikon në asnjë mënyrë në variablin result.
Le të kuptojmë atëherë, pse në përgjithësi ne mund të mos shkruajmë pikëpresje në JavaScript. Le të themi se kemi këtë kod pa pikëpresje:
let result = 1 // në result do të shkruhet 1
let test = 2 // në test do të shkruhet 2
Ai funksionon si duhet, pasi interpretuesi vendosi vetë në fund të çdo rreshti pikëpresje.
Por shikoni këtë kod:
let result = 1
+ 2; // në result do të shkruhet 3
Tani pikëpresja në fund të rreshtit të parë nuk do të vendoset automatikisht, pasi interpretuesi e kupton se komanda e rreshtit të dytë është pjesë e komandës së rreshtit të parë.
Por nëse ne e vendosim pikëpresjen vetë - rezultati do të jetë krejt tjetër:
let result = 1; // në result do të shkruhet 1
+ 2; // komanda nuk bën asgjë, por as nuk do të ketë gabim
Rezulton se interpretuesi vendos vetë pikëpresje, vetëm nëse komanda e mëpasshme nuk është pjesë e asaj të mëparshme.
Dhe tani shikoni këtë kod:
let result = 1
+function() {
return 2;
}();
console.log(result);
Vërtet, rreshti i dytë është thjesht vazhdim i komandës së rreshtit të parë dhe interpretuesi nuk vendos pikëpresje automatikisht. Pikërisht prandaj, nëse ne e shkruajmë pikëpresjen vetë në fund të rreshtit të parë - rezultati do të jetë krejt tjetër. Kjo tregon se është më mirë që gjithmonë të vendosim pikëpresje në vendet e duhura, për të shmangur problemet.