Pasti IIFE v JavaScript
Oglejmo si dva koda odlomka.
Prvi:
let result = 1
+function() {
return 2;
}();
console.log(result);
Drugi:
let result = 1;
+function() {
return 2;
}();
console.log(result);
Ta dva koda odlomka sta skoraj enaka,
vendar če jih zaženemo - bo rezultat drugačen.
Prva koda bo v konzolo izpisala številko 3,
druga pa številko 1.
Zakaj je prišlo do takšne razlike: vse je v tem, da v enem primeru v prvi vrstici koda na koncu manjka podpičje, v drugem primeru pa je prisotno.
Lahko vprašate: kako je to mogoče, saj v JavaScript pika podpičje na koncu ukaza ni obvezno! Pravzaprav to ni čisto tako. Ugotovimo, kaj se nam pravzaprav dogaja.
Prvo kodo lahko prepišemo takole:
let result = 1 + function() {
return 2;
}();
console.log(result); // izpiše 3
Zdaj takoj postane očitno, da k
enici prištejemo rezultat klica funkcije
na mestu, to je 2. Zato bo končni
rezultat 3.
Če pa za enico postavimo podpičje, bo interpreter kodo razumel drugače:
// Prvi ukaz:
let result = 1;
// Drugi ukaz:
+function() {
return 2;
}();
// Tretji ukaz:
console.log(result); // izpiše 1
To pomeni, da bosta dodelitev v spremenljivko in klic funkcije na mestu postala različna ukaza. In vse zaradi prisotnosti podpičja!
Izkazalo se je, da v tem primeru klic funkcije
na mestu pravzaprav ne naredi nič - preprosto
v nič vrne številko 2, ki
na spremenljivko result ne vpliva na noben način.
Potem pa ugotovimo, zakaj sploh lahko ne pišemo podpičja v JavaScript. Recimo, da imamo takšno kodo brez podpičij:
let result = 1 // v result se zapiše 1
let test = 2 // v test se zapiše 2
Deluje pravilno, saj je interpreter sam na koncu vsake vrstice postavil piko s podpičjem.
A poglejte si takšno kodo:
let result = 1
+ 2; // v result se zapiše 3
Zdaj se podpičje na koncu prve vrstice ne postavi samodejno, saj interpreter razume, da je ukaz druge vrstice - to del ukaza prve vrstice.
A če sami postavimo podpičje - bo rezultat povsem drugačen:
let result = 1; // v result se zapiše 1
+ 2; // ukaz ne naredi nič, a tudi napake ne bo
Izkazalo se je, da interpreter sam postavi piko s podpičjem, le če naslednji ukaz ni del prejšnjega.
In zdaj poglejte si to kodo:
let result = 1
+function() {
return 2;
}();
console.log(result);
Res, druga vrstica - je preprosto nadaljevanje ukaza prve vrstice in interpreter ne postavi podpičja samodejno. Prav zato, če sami napišemo piko s podpičjem na koncu prve vrstice - bo rezultat povsem drugačen. To nakazuje, da je najbolje vedno postaviti piko s podpičjem na pravih mestih, da se izognemo težavam.