JavaScript-да IIFE-нинг хавфлари
Келгина, иккита код бўлагини кўриб чиқайлик.
Биринчиси:
let result = 1
+function() {
return 2;
}();
console.log(result);
Иккинчиси:
let result = 1;
+function() {
return 2;
}();
console.log(result);
Бу икки код бўлаги деярли бир хил,
лекин уларни ишга туширсангиз - натижа фарқ қилади.
Биринчи код консолга 3 сонини чиқаради,
иккинчиси эса - 1 сонини.
Нима учун бундай фарқ пайдо бўлди: ҳаммаси бир ҳолда биринчи сатр коднинг охирида нуқтали вергул йўқлигида, иккинчи ҳолда эса - мавжудлигида.
Сиз сўрашингиз мумкин: яхши, лекин JavaScript-да буйруқ охида нуқтали вергул majburiy эмас! Аслида бу ўшандай эмас. Келиб, нима бўлаяпти, аслида аник кўриб чиқайлик.
Биринчи кодни шундай ёзиш мумкин:
let result = 1 + function() {
return 2;
}();
console.log(result); // 3 ни чиқаради
Энди бирдан маълум бўладики, бирликка
жойида чакирилган функциянинг натижаси
қўшилмоқда, яъни 2. Шу сабабдан якуний
натижа 3 бўлади.
Агар бирликдан кейин нуқтали вергул қўйилса, код интерпретатор томонидан бошқача тушунилади:
// Биринчи буйруқ:
let result = 1;
// Иккинчи буйруқ:
+function() {
return 2;
}();
// Учинчи буйруқ:
console.log(result); // 1 ни чиқаради
Яъни ўзгарувчига тенглаштириш ва функцияни жойида чакириш турли буйруқларга айланади. Ва �аммаси нуқтали вергул мавжудлиги сабабли!
Маълум бўладики, бу ҳолда функцияни жойида чакириш
умuman ҳеч нарса қилмайди - жуда оддий
ҳеч қайерга 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);
Дарҳақиқат, иккинчи сатр - биринчи сатр буйруғининг жуда оддий давоми ва интерпретатор нуқтали вергулни автоматик қўймайди. Ана шу сабабдан, агар биз биринчи сатр охида ўзимиз нуқтали вергул ёзсак - натижа бошқача бўлади. Бу шунни кўрсатадики, мумкин бўлган ҳолда ҳар доим нуқтали вергулни керакли жойларда қўйиш, муаммолардан қочиш учун яхшироқ.