Хавфҳои ноаён дар IIFE дар JavaScript
Биёед ду порчаи кодро дида бароем.
Якум:
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);
Дарвоқеъ, сатри дуюм - танҳо идомаи фармони сатри якум аст ва интерпретатор нуқта-вергул ба таври худкор намегузорад. Аз ин рӯ, агар мо худамон нуқта-вергул дар охири сатри якум нависем - натиҷа комилан дигар хоҳад буд. Ин нишон медиҳад, ки беҳтарин аст ҳамеша нуқта-вергул дар ҷойҳои зарурӣ гузошта шавад, барои пешгирӣ аз мушкилот.