Слепните камења на IIFE во JavaScript
Да разгледаме два парчиња код.
Првото:
let result = 1
+function() {
return 2;
}();
console.log(result);
Второто:
let result = 1;
+function() {
return 2;
}();
console.log(result);
Овие два парчиња код се скоро идентични,
но ако се стартуваат - резултатот ќе се разликува.
Првиот код ќе испечати во конзола бројот 3,
а вториот - бројот 1.
Зошто се случи таква разлика: сè е во тоа што во еден случај во првиот ред на код на крајот отсутствува точка-запирка, а во вториот случај - присутна е.
Може да прашате: како е можно, на крајот на краиштата во JavaScript точка-запирка на крајот од командата не е задолжителна! Всушност ова не е сосема така. Да расчлениме, што всушност се случува кај нас.
Првиот код може да се препише вака:
let result = 1 + function() {
return 2;
}();
console.log(result); // ќе испечати 3
Сега веднаш станува очигледно дека кон
единицата се додава резултатот од повикувањето на функцијата
на место, односно 2. Затоа крајниот
резултат ќе биде 3.
Доколку по единицата се стави точка-запирка, тогаш кодот ќе се восприеме од интерпретаторот поинаку:
// Прва команда:
let result = 1;
// Втора команда:
+function() {
return 2;
}();
// Трета команда:
console.log(result); // ќе испечати 1
Односно доделувањето во променливата и повикувањето на функцијата на место ќе станат различни команди. И сè заради присуството на точка-запирка!
Излегува дека во овој случај повикувањето на функцијата
на место воопшто не прави ништо - едноставно
враќа број 2 во ништовност, кој
не влијае никако на променливата result.
Ајде тогаш да расчлениме, а зошто воопшто можеме да не пишуваме точка-запирка во JavaScript. Нека имаме ваков код без точки-запирки:
let result = 1 // во result ќе се запише 1
let test = 2 // во test ќе се запише 2
Тој работи коректно, бидејќи интерпретаторот сам ги поставил на крајот од секој ред точка-запирка.
Но погледнете го ваков код:
let result = 1
+ 2; // во result ќе се запише 3
Сега точка-запирка на крајот од првиот ред нема да се стави автоматски, бидејќи интерпретаторот разбира дека командата од вториот ред - ова е дел од командата од првиот ред.
Но ако ние самите ставиме точка-запирка - резултатот ќе биде сосема поинаков:
let result = 1; // во result ќе се запише 1
+ 2; // командата не прави ништо, но ниту грешка ќе има
Излегува дека интерпретаторот сам става точка-запирка, само доколку следната команда не е дел од претходната.
А сега погледнете го овој код:
let result = 1
+function() {
return 2;
}();
console.log(result);
Навистина, вториот ред - едноставно продолжение на командата од првиот ред и интерпретаторот не става точка-запирка автоматски. Токму затоа, ако ние самите напишеме точка-запирка на крајот од првиот ред - резултатот ќе биде сосема поинаков. Ова говори дека најдобро е секогаш да се става точка-запирка на потребните места, за да се избегнат проблеми.