JavaScript-də IIFE-nin Tələ Təpələri
Gəlin iki kod parçasını nəzərdən keçirək.
Birinci:
let result = 1
+function() {
return 2;
}();
console.log(result);
Ikinci:
let result = 1;
+function() {
return 2;
}();
console.log(result);
Bu iki kod parçası demək olar ki, eynidir,
amma onları işə salsaq - nəticə fərqli olacaq.
Birinci kod konsola 3 rəqəmini çıxaracaq,
ikinci isə - 1 rəqəmini.
Belə bir fərq niyə yarandı: bütün iş odur ki, bir halda birinci sətrin sonunda nöqtəli vergül yoxdur, ikinci halda isə var.
Siz soruşa bilərsiniz: bu necə ola bilər, axı JavaScript-də əmr sonunda nöqtəli vergül məcburi deyil! Əslində bu tam belə deyil. Gəlin anlayaq, əslində nə baş verir.
Birinci kodu belə yenidən yazmaq olar:
let result = 1 + function() {
return 2;
}();
console.log(result); // 3 çıxaracaq
Indi dərhal aydın oldu ki, birə
yerində çağırılan funksiyanın nəticəsi,
yəni 2 əlavə olunur. Buna görə yekun
nəticə 3 olacaq.
Birdən sonra nöqtəli vergül qoyulsa, kod interpreator tərəfindən başqa cür qəbul olunacaq:
// Birinci əmr:
let result = 1;
// Ikinci əmr:
+function() {
return 2;
}();
// Üçüncü əmr:
console.log(result); // 1 çıxaracaq
Yəni dəyişənə mənimsətmə və funksiyanı yerində çağırma ayrı-ayrı əmrlər olacaq. Və bütün bunlar nöqtəli vergülün olmasına görə!
Belə çıxır ki, bu halda funksiyanı yerində çağırmaq
ümumiyyətlə heç nə etmir - sadəcə
heç yerə 2 rəqəmini qaytarır, hansı ki
result dəyişəninə heç bir təsir etmir.
Gəlin onda anlayaq, biz niyə ümumiyyətlə JavaScript-də nöqtəli vergül yaza bilmirik. Bizim nöqtəli vergülsüz belə bir kodumuz olsun:
let result = 1 // result-a 1 yazılacaq
let test = 2 // test-ə 2 yazılacaq
O düzgün işləyir, çünki interpretator özü hər sətrin sonuna nöqtəli vergül qoydu.
Amma belə bir koda baxın:
let result = 1
+ 2; // result-a 3 yazılacaq
Indi birinci sətrin sonunda nöqtəli vergül avtomatik qoyulmayacaq, çünki interpretator başa düşür ki, ikinci sətrin əmri - bu birinci sətrin əmrinin bir hissəsidir.
Amma əgər biz özümüz nöqtəli vergül qoysaq - nəticə tamamilə başqa olacaq:
let result = 1; // result-a 1 yazılacaq
+ 2; // əmr heç nə etmir, amma səhv də olmayacaq
Belə çıxır ki, interpretator özü nöqtəli vergülü yalnız o halda qoyur ki, növbəti əmr əvvəlkinin bir hissəsi olmasın.
Indi isə bu koda baxın:
let result = 1
+function() {
return 2;
}();
console.log(result);
Həqiqətən də, ikinci sətr - sadəcə birinci sətrin əmrinin davamıdır və interpretator nöqtəli vergülü avtomatik qoymur. Məhz buna görə, əgər biz özümüz nöqtəli vergülü birinci sətrin sonuna yazsaq - nəticə tamamilə başqa olacaq. Bu o deməkdir ki, problemdən qaçınmaq üçün, ən yaxşısı həmişə lazımi yerlərdə nöqtəli vergülü qoymaqdır.