JavaScript-ում IIFE-ի թաքնված խնդիրները
Դիտարկենք կոդի երկու հատված:
Առաջինը.
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);
Իսկապես, երկրորդ տողը պարզապես առաջին տողի հրամանի շարունակությունն է և մեկնաբանիչը ինքնաբերաբար կետ-ստորակետ չի դնում: Հենց այդ պատճառով, եթե մենք ինքներդ կետ ստորակետ գրենք առաջին տողի վերջում - արդյունքը կլինի բոլորովին այլ: Սա ցույց է տալիս, որ լավագույնն է միշտ դնել կետ-ստորակետ անհրաժեշտ տեղերում, խնդիրներից խուսափելու համար: