Fallgruver ved IIFE i JavaScript
La oss se på to kodesnutter.
Første:
let resultat = 1
+function() {
return 2;
}();
console.log(resultat);
Andre:
let resultat = 1;
+function() {
return 2;
}();
console.log(resultat);
Disse to kodesnuttene er nesten identiske,
men hvis de kjøres - vil resultatet være forskjellig.
Den første koden vil skrive ut tallet 3 til konsollen,
og den andre - tallet 1.
Hvorfor er det en slik forskjell: alt handler om at i det ene tilfellet på slutten av første linje mangler det semikolon, og i det andre tilfellet - er den til stede.
Du kan spørre: hvordan kan det være, for i JavaScript er semikolon på slutten av en kommando ikke obligatorisk! Egentlig er det ikke helt sant. La oss finne ut hva som egentlig skjer.
Den første koden kan omskrives slik:
let resultat = 1 + function() {
return 2;
}();
console.log(resultat); // vil skrive ut 3
Nå blir det umiddelbart åpenbart at
en plusser resultatet av funksjonskjøringen
på stedet, det vil si 2. Derfor blir det endelige
resultatet 3.
Hvis man setter semikolon etter eneren, vil koden bli oppfattet annerledes av tolkeren:
// Første kommando:
let resultat = 1;
// Andre kommando:
+function() {
return 2;
}();
// Tredje kommando:
console.log(resultat); // vil skrive ut 1
Det vil si at tilordning til variabel og kall av funksjon på stedet blir forskjellige kommandoer. Og alt på grunn av tilstedeværelsen av semikolon!
Det viser seg at i dette tilfellet gjør funksjonskallet
på stedet egentlig ingenting - den returnerer bare
tallet 2 uten videre, som
ikke påvirker variabelen resultat på noen måte.
La oss da finne ut, hvorfor vi i det hele tatt kan la være å skrive semikolon i JavaScript. La oss si at vi har en slik kode uten semikolon:
let resultat = 1 // i resultat skrives 1
let test = 2 // i test skrives 2
Den fungerer korrekt, fordi tolkeren selv satte semikolon på slutten av hver linje.
Men se på denne koden:
let resultat = 1
+ 2; // i resultat skrives 3
Nå blir det ikke satt semikolon på slutten av første linje automatisk, fordi tolkeren forstår at kommandoen på andre linje er en del av kommandoen på første linje.
Men hvis vi selv setter semikolon - vil resultatet bli helt annerledes:
let resultat = 1; // i resultat skrives 1
+ 2; // kommandoen gjør ingenting, men heller ingen feil
Det viser seg at tolkeren selv setter semikolon, bare hvis den neste kommandoen ikke er en del av den forrige.
Og se nå på denne koden:
let resultat = 1
+function() {
return 2;
}();
console.log(resultat);
Indeed, the second line is simply a continuation of the command on the first line and the interpreter does not put a semicolon automatically. This is exactly why, if we write the period ourselves semicolon at the end of the first line - the result will be completely different. This indicates that it is best to always put a semicolon in the right places, to avoid problems.