JavaScript-ում IIFE-ի թաքնված խնդիրները

Դիտարկենք կոդի երկու հատված:

Առաջինը.

javascriptlet result = 1
+function() {
  return 2;
}();

console.log(result);

Երկրորդը.

javascriptlet result = 1;
+function() {
  return 2;
}();

console.log(result);

Կոդի այս երկու հատվածները գործնականում նույնն են, բայց եթե դրանք գործարկվեն, արդյունքը կտարբերվի: Առաջին կոդը կոնսոլում կցուցադրի 3 թիվը, իսկ երկրորդը՝ 1 թիվը:

Տարբերության պատճառը. ամեն ինչ կապված է նրա հետ, որ մի դեպքում առաջին տողի վերջում կետ-ստորակետ չկա, իսկ մյուս դեպքում՝ կա:

Դուք կարող եք հարցնել. ինչպե՞ս է դա հնարավոր, քանի որ JavaScript-ում հրամանի վերջում կետ-ստորակետը պարտադիր չէ: Իրականում դա ամբողջովին ճիշտ չէ: Եկեք հասկանանք, թե իրականում ինչ է տեղի ունենում:

Առաջին կոդը կարելի է վերագրել այսպես.

javascriptlet result = 1 + function() {
  return 2;
}();

console.log(result); // կցուցադրի 3

Այժմ ակնհայտ է դառնում, որ մեկին ավելացվում է ֆունկցիայի անմիջական կանչի արդյունքը, այսինքն՝ 2: Ուստի վերջնական արդյունքը կլինի 3:

Եթե մեկից հետո դրվի կետ-ստորակետ, ապա կոդը մեկնաբանիչի կողմից կընկալվի այլ կերպ.

javascript// Առաջին հրաման.
let result = 1;

// Երկրորդ հրաման.
+function() {
  return 2;
}();

// Երրորդ հրաման.
console.log(result); // կցուցադրի 1

Այսինքն, փոփոխականին վերագրումը և ֆունկցիայի անմիջական կանչը կդառնան տարբեր հրամաններ: Եվ այդ ամենը կետ-ստորակետի առկայության պատճառով:

Ստացվում է, որ այս դեպքում ֆունկցիայի անմիջական կանչը ընդհանրապես ոչինչ չի անում - պարզապես ոչինչի մեջ է վերադարձնում 2 թիվը, որն ոչ մի կերպ չի ազդում result փոփոխականի վրա:

Եկեք այդ դեպքում հասկանանք, թե ընդհանրապես ինչու մենք կարող ենք չգրել կետ-ստորակետ JavaScript-ում: Ենթադրենք ունենք կետ-ստորակետներ չունեցող այսպիսի կոդ.

javascriptlet result = 1 // result-ի մեջ կգրվի 1
let test = 2   // test-ի մեջ կգրվի 2

Այն աշխատում է կոռեկտ, քանի որ մեկնաբանիչը ինքնուրույն է դնում յուրաքանչյուր տողի վերջում կետ ստորակետ:

Բայց նայեք այսպիսի կոդին.

javascriptlet result = 1
+ 2; // result-ի մեջ կգրվի 3

Այժմ առաջին տողի վերջում կետ-ստորակետը ինքնաբերաբար չի դրվի, քանի որ մեկնաբանիչը հասկանում է, որ երկրորդ տողի հրամանը առաջին տողի հրամանի մասն է:

Բայց եթե մենք ինքներդ կետ-ստորակետ դնենք - արդյունքը կլինի բոլորովին այլ.

javascriptlet result = 1; // result-ի մեջ կգրվի 1
+ 2; // հրամանը ոչինչ չի անում, բայց և սխալ էլ չի լինի

Ստացվում է, որ մեկնաբանիչը ինքն է դնում կետ-ստորակետ, միայն եթե հաջորդ հրամանը նախորդի մաս չէ:

Եվ այժմ նայեք այս կոդին.

javascriptlet result = 1
+function() {
  return 2;
}();

console.log(result);

Իսկապես, երկրորդ տողը պարզապես առաջին տողի հրամանի շարունակությունն է և մեկնաբանիչը ինքնաբերաբար կետ-ստորակետ չի դնում: Հենց այդ պատճառով, եթե մենք ինքներդ կետ ստորակետ գրենք առաջին տողի վերջում - արդյունքը կլինի բոլորովին այլ: Սա ցույց է տալիս, որ լավագույնն է միշտ դնել կետ-ստորակետ անհրաժեշտ տեղերում, խնդիրներից խուսափելու համար: