Underjordiske sten ved IIFE i JavaScript
Lad os se på to stykker kode.
Første:
let result = 1
+function() {
return 2;
}();
console.log(result);
Anden:
let result = 1;
+function() {
return 2;
}();
console.log(result);
Disse to stykker kode er næsten ens,
men hvis de køres - vil resultatet være forskelligt.
Den første kode vil udskrive tallet 3 til konsollen,
og den anden - tallet 1.
Hvorfor er der sådan en forskel: det hele handler om, at i det ene tilfælde er der ikke noget semikolon i slutningen af den første linje kode, og i det andet tilfælde - er der.
Du kan spørge: hvordan kan det være, for i JavaScript er semikolon i slutningen af en kommando ikke obligatorisk! Faktisk er det ikke helt sandt. Lad os finde ud af, hvad der virkelig sker.
Den første kode kan omskrives sådan her:
let result = 1 + function() {
return 2;
}();
console.log(result); // udskriver 3
Nu bliver det straks indlysende, at der
lægges resultatet af funktionskaldet
til eneren, altså 2. Derfor vil det endelige
resultat blive 3.
Hvis man derimod sætter et semikolon efter eneren, vill koden blive opfattet anderledes af fortolkeren:
// Første kommando:
let result = 1;
// Anden kommando:
+function() {
return 2;
}();
// Tredje kommando:
console.log(result); // udskriver 1
Altså vil tildelingen til variablen og kaldet af funktionen på stedet blive til separate kommandoer. Og alt på grund af tilstedeværelsen af et semikolon!
Det viser sig, at funktionskaldet
på stedet i dette tilfælde ikke gør noget - det
returnerer bare tallet 2 uden i intet,
som ikke påvirker variablen result.
Lad os så finde ud af, hvorfor vi overhovedet kan lade være med at skrive semikolon i JavaScript. Lad os sige, at vi har sådan en kode uden semikolon:
let result = 1 // i result gemmes 1
let test = 2 // i test gemmes 2
Den fungerer korrekt, fordi fortolkeren selv sætter et semikolon i slutningen af hver linje.
Men se på sådan en kode:
let result = 1
+ 2; // i result gemmes 3
Nu bliver der ikke sat semikolon i slutningen af den første linje automatisk, fordi fortolkeren forstår, at kommandoen på den anden linje er en del af kommandoen på den første linje.
Men hvis vi selv sætter et semikolon - vil resultatet være et helt andet:
let result = 1; // i result gemmes 1
+ 2; // kommandoen gør intet, men der vil ikke være fejl
Det viser sig, at fortolkeren selv sætter semikolon, kun hvis den næste kommando ikke er en del af den forrige.
Og se nu på denne kode:
let result = 1
+function() {
return 2;
}();
console.log(result);
Faktisk er den anden linje - blot en fortsættelse af kommandoen på den første linje, og fortolkeren sætter ikke semikolon automatisk. Netop derfor, hvis vi selv skriver semikolon i slutningen af den første linje - vil resultatet være et helt andet. Det fortæller os, at det er bedst altid at sætte semikolon på de nødvendige steder, for at undgå problemer.