Хавфҳои ноаён дар IIFE дар JavaScript

Биёед ду порчаи кодро дида бароем.

Якум:

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

Дарвоқеъ, сатри дуюм - танҳо идомаи фармони сатри якум аст ва интерпретатор нуқта-вергул ба таври худкор намегузорад. Аз ин рӯ, агар мо худамон нуқта-вергул дар охири сатри якум нависем - натиҷа комилан дигар хоҳад буд. Ин нишон медиҳад, ки беҳтарин аст ҳамеша нуқта-вергул дар ҷойҳои зарурӣ гузошта шавад, барои пешгирӣ аз мушкилот.