IIFE kļūdu iespējas JavaScript
Apskatīsim divus koda fragmentus.
Pirmais:
let result = 1
+function() {
return 2;
}();
console.log(result);
Otrais:
let result = 1;
+function() {
return 2;
}();
console.log(result);
Šie divi koda fragmenti ir gandrīz identiski,
bet, tos palaidot, rezultāts atšķirsies.
Pirmais kods izvadīs konsolē skaitli 3,
bet otrais - skaitli 1.
Kāpēc radās šāda atšķirība: visa lieta ir tajā, ka vienā gadījumā pirmās rindas beigās trūkst semikols, bet otrajā gadījumā - tas ir.
Jūs varat jautāt: kā tas var būt, jo JavaScript semikols komandas beigās nav obligāts! Patiesībā tas nav gluži tā. Izpratīsim, kas mums patiesībā notiek.
Pirmo kodu var pārrakstīt šādi:
let result = 1 + function() {
return 2;
}();
console.log(result); // izvadīs 3
Tagad uzreiz kļūst skaidrs, ka pie
vieninieka tiek pieskaitīts funkcijas
izsaukšanas uzreiz rezultāts, tas ir 2. Tāpēc gala
rezultāts būs 3.
Ja pēc vieninieka ieliek semikolu, tad kods tiks interpretētāja uztverts citādi:
// Pirmā komanda:
let result = 1;
// Otrā komanda:
+function() {
return 2;
}();
// Trešā komanda:
console.log(result); // izvadīs 1
Tas ir, piešķiršana mainīgajā un funkcijas izsaukšana uzreiz kļūs par atšķirīgām komandām. Un tas viss semikola klātbūtnes dēļ!
Izrādās, ka šajā gadījumā funkcijas
izsaukšana uzreiz nemaz neko nedara - vienkārši
nekur neko neatgriež, skaitli 2, kas
nekādā veidā neietekmē mainīgo result.
Tad sapratīsim, kāpēc mēs vispār varam nerakstīt semikolu JavaScript. Lai mums ir šāds kods bez semikoliem:
let result = 1 // result tiks ierakstīts 1
let test = 2 // test tiks ierakstīts 2
Tas darbojas korekti, jo interpretētājs pats katras rindas beigās ievietoja semikolu.
Bet apskatieties uz šādu kodu:
let result = 1
+ 2; // result tiks ierakstīts 3
Tagad semikols pirmās rindas beigās netiks automātiski ielikts, jo interpretētājs saprot, ka otrās rindas komanda ir pirmās rindas komandas daļa.
Bet, ja mēs paši ieliksim semikolu, rezultāts būs pavisam cits:
let result = 1; // result tiks ierakstīts 1
+ 2; // komanda neko nedara, bet arī kļūdas nebūs
Izrādās, ka interpretētājs pats liek semikolu tikai tad, ja nākamā komanda nav iepriekšējās daļa.
Un tagad apskatieties uz šo kodu:
let result = 1
+function() {
return 2;
}();
console.log(result);
Patiešām, otrā rinda - vienkārši turpinājums pirmās rindas komandai un interpretētājs neliek semikolu automātiski. Tieši tāpēc, ja mēs paši ierakstīsim semikolu pirmās rindas beigās - rezultāts būs pavisam cits. Tas norāda, ka vislabāk vienmēr ielikt semikolu vajadzīgajās vietās, lai izvairītos no problēmām.