JavaScript-də Closure
-
Closure JavaScript-də çox vacib və güclü bir anlayışdır. Bu anlayışı bilmək funksiyaların necə işlədiyini daha dərindən anlamağa kömək edir və bir çox qabaqcıl texnikaların əsasını təşkil edir.
Sadə dillə desək, closure — bir funksiyanın özünün daxilində yaradıldığı mühitə (scope) çıxış əldə etməsi deməkdir, hətta o mühit artıq mövcud olmasa belə.
Closure necə işləyir?
JavaScript-də bir funksiya başqa bir funksiyanın içində yaradıldıqda, daxili funksiya xarici funksiyanın dəyişənlərinə çıxış edə bilir. Bu əlaqə closure adlanır.
Başqa sözlə:
- Daxili funksiya (inner function) xarici funksiyanın (outer function) dəyişənlərini “yada saxlayır” və istifadə edə bilir.
Sadə bir nümunə
function salamVer(name) { return function() { console.log(`Salam, ${name}!`); }; } const salamNilay = salamVer('Nilay'); salamNilay(); // Salam, Nilay!
İzah:
salamVer
funksiyası içində yeni bir funksiya qaytarır.salamNilay
dəyişənindəsalamVer
funksiyası çağırılır vəname
dəyişəninin dəyəriNilay
olaraq yadda qalır.- Sonra
salamNilay()
çağırıldıqda, o,name
dəyişəninə çıxış edir, baxmayaraq ki,salamVer
funksiyası artıq icrasını bitirib.
Bu closure nümunəsidir.
Closure aşağıdakı hallarda faydalıdır:
- Məlumatların gizlədilməsi (Data encapsulation)
- Özəl dəyişənlər yaratmaq
- Funksiya fabrikləri (function factories)
- Currying və partial application texnikaları
- Asinxron kodda (məsələn, setTimeout ilə) düzgün dəyişən tutmaq
Closure ilə dəyişənlər yaratmaq
Closure bizə özəl (private) dəyişənlər yaratmağa imkan verir.
Nümunə:
function saygacYarat() { let say = 0; return { artir: function() { say++; console.log(say); }, sifirla: function() { say = 0; console.log('Sıfırlandı'); } }; } const saygac = saygacYarat(); saygac.artir(); // 1 saygac.artir(); // 2 saygac.sifirla(); // Sıfırlandı saygac.artir(); // 1
İzah:
say
dəyişənisaygacYarat
funksiyası daxilindədir və birbaşa çöldən çıxış mümkün deyil.- Amma
artir
vəsifirla
funksiyaları say dəyişəninə çıxış edə bilir.
Closure və Dövrlər (Loops)
Closure istifadə edərkən
for
dövrlərində klassik səhvlər edilə bilər.Problemli nümunə:
for (var i = 0; i < 3; i++) { setTimeout(function() { console.log(i); }, 1000); } // 3 // 3 // 3
İzah:
- Bütün funksiyalar eyni
i
dəyişəninə bağlıdır və dövr bitəndəi=3
olur.
Doğru yanaşma (let ilə):
for (let i = 0; i < 3; i++) { setTimeout(function() { console.log(i); }, 1000); } // 0 // 1 // 2
let
dəyişəni blok səviyyəli olduğuna görə hər dəfə yeni biri
yaradılır və closure düzgün işləyir.
Closure İlə
Function Factory
Funksiya fabrikləri closure istifadə edir:
function multiplier(x) { return function(y) { return x * y; }; } const twoTimes = multiplier(2); const threeTimes = multiplier(3); console.log(twoTimes(5)); // 10 console.log(threeTimes(5)); // 15
multiplier(2)
çağırışındax=2
dəyəri yadda qalır və iki dəfə artıran funksiya yaranır.
Closure xüsusiyyətləri
Xüsusiyyət Təsviri Mühit Closure funksiyanın yaradıldığı mühiti saxlayır Uzunömürlülük Closure-lar lazımi dəyişənləri yadda saxlayır, mühit bağlansa da işləyir Özəl dəyişənlər Closure ilə xaricdən dəyişdirilə bilməyən dəyişənlər yaradıla bilər
Nəticə
Closure JavaScript proqramlaşdırmasında çox güclü bir anlayışdır. Bu konsepti başa düşmək kodunuzu daha güclü, çevik və təhlükəsiz edəcəkdir. Closure-ları başa düşən proqramçı asinxron əməliyyatları, modul dizaynını və kompleks funksiyaları daha rahat idarə edə bilər.
Unutmayın: Closure — funksiyanın yadda saxladığı gizli bağdır.
Bilik paylaşdıqca artan bir sərvətdir