Closure
JavaScript-də closure, bir funksiyanın daxilində təyin olunan inner function-un outer function-un dəyişənlərinə xaricdən giriş imkanı əldə etməsi hadisəsidir.
function greeting(name) {
let greet = "Good morning";
setTimeout(function () {
console.log(greet + name);
}, 5000);
}
greeting("john");
Bu nümunədə, greeting
funksiyası daxilində greet
adlı bir dəyişən təyin olunub. Normalda, greeting
funksiyası çağırıldıqda işini bitirir və stack-dan silinir. Funksiya daxilindəki dəyişənlər də bu zaman yaddaşdan silinməlidir. Lakin burada bir sual yaranır: setTimeout necə işləyir? Əgər greet
dəyişəni silinibsə, niyə bu dəyişənə hələ də giriş mümkündür?
Bu məqamda closure anlayışı işə düşür. JavaScript mühərriki görür ki, greet
dəyişəninə daxili funksiya (setTimeout
daxilindəki anonim funksiya) tərəfindən istinad edilir. Buna görə də, greet
yaddaşda saxlanılır və həmin funksiyaya əlçatan olur. Yəni, closure sayəsində greeting
funksiyasının daxilindəki greet
dəyişəni setTimeout
funksiyası icra olunana qədər yaddaşda qalır və silinmir.
Başqa bir nümunəyə baxaq:
function makeFunc() {
const name = "closure";
function displayName() {
console.log(name);
}
return displayName;
}
const myFunc = makeFunc();
myFunc();
Bu nümunədə, makeFunc
funksiyası daxilində name
adlı bir dəyişən təyin olunub. displayName
adlı daxili funksiya, name
dəyişənini çap etmək üçün istifadə olunur. makeFunc
funksiyası çağırıldıqda, displayName
funksiyası geri qaytarılır və myFunc
adlı bir dəyişənə təyin edilir.
myFunc
çağırıldıqda, displayName
funksiyası işə düşür və name
dəyişəninə daxil olur. Bu vəziyyətdə, displayName
funksiyası makeFunc
funksiyası bitdikdən sonra belə name
dəyişəninə giriş imkanı saxlayır. Bu, closure anlayışının bir nümunəsidir; displayName
funksiyası, makeFunc
funksiyası icra olunduqdan sonra belə name
dəyişənini yaddaşda saxlayır.