⊗jsPmFCPf 272 of 505 menu

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);

Дарҳақиқат, иккинчи сатр - биринчи сатр буйруғининг жуда оддий давоми ва интерпретатор нуқтали вергулни автоматик қўймайди. Ана шу сабабдан, агар биз биринчи сатр охида ўзимиз нуқтали вергул ёзсак - натижа бошқача бўлади. Бу шунни кўрсатадики, мумкин бўлган ҳолда ҳар доим нуқтали вергулни керакли жойларда қўйиш, муаммолардан қочиш учун яхшироқ.

Ўзбек
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeOʻzbekTiếng Việt
Биз веб-сайт ишлаши, таҳлил қилиш ва персоналлаштириш учун кукидан фойдаланамиз. Маълумотларни қайта ишлаш Махфийлик сиёсатига мувофиқ амалга оширилади.
ҳаммасини қабул қилиш мослаштириш рад этиш