Скрајдне камење 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);
Заиста, други ред - једноставно наставак команде првог реда и интерпретатор не ставља тачку и зарез аутоматски. Управо због тога, ако ми сами напишемо тачку и зарез на крају првог реда - резултат ће бити сасвим другачији. Ово говори о томе да је најбоље увек ставити тачку и зарез на потребним местима, како би се избегли проблеми.