29 Kasım 2022 • 20 dakikalık okuma
JavaScript Closure, üst kapsamındaki lokal değerlere erişim hakkına sahip fonksiyondur. Closure mantığını kavrayabilmek için öncelikle değişken ve kapsam kavramları anlaşılmalıdır; JavaScript değişkenler global (en üst) veya local scope (lokal kapsamda) tanımlanırlar.
JavaScript dilinde bir fonksiyon içinde tanımlanan değişkenler (local scope) lokal kapsamda tanımlanırlar. Lokal tanımlı değişkenler tanımlandığı fonksiyon çağrıldığında oluşturulur ve fonksiyon çalıştırılması tamamlandığında bellekten düşerler. Bu nedenle lokal değişkenler tanımlandığı fonksiyonun dışından erişilemezler.
<script>
function greeting() {
var message = 'Merhaba'; // lokal kapsamdaki değişken
console.log(message);
}
</script>
JavaScript dilinde var , let ya da const anahtar kelimesiyle tanımlanan tüm değişkenler global kapsamda tamımlanır.
<script>
var name = 'Kamil'; // global kapsamdaki değişken
function greeting() {
var message = 'Merhaba';
console.log(message + ' ' + name);
}
</script>
Bir fonksiyon içinde var, let ya da const anahtar kelimesi olmadan tanımlanan değişkenler fonksiyonun içinde olmasına rağmen her zaman global olarak tanımlanır.
<script>
function greeting() {
var message = 'Merhaba';
name = 'Kamil'; // global kapsamdaki değişken
console.log(message + ' ' + name);
}
</script>
Global tanımlı değişkenler sayfa kapatılana kadar erişilebilir durumdadır ve sayfadaki tüm fonksiyon ve kodlar tarafından erişilebilir, let ve const ile tanımlanmadıysa değeri değiştirilebilir. Global değişkenler diğer fonksiyonlar içinden de erişilebilirler.
JavaScript dilinde iç içe fonksiyon tanımlanabilir;
<script>
function greeting() {
var message = 'Merhaba';
function sayHi() {
console.log(message);
}
sayHi();
}
greeting();
</script>
Closure fonksiyon, üst kapsamındaki lokal değerlere erişim hakkına sahip fonksiyondur. Daha anlaşılır bir ifadeyle; içerideki fonksiyon daima dışındaki lokal değişken ve fonksiyonlara erişme hakkına sahiptir.
<script>
function greeting() {
var message = 'Merhaba';
function sayHi() {
console.log(message);
}
return sayHi;
}
var hi = greeting();
hi(); // hi fonksiyonu message değişkenine erişebilir.
</script>
Aşağıdaki örnekde sayHi ve sayHello fonksiyonları closure fonksiyondur. Aynı fonksiyon gövdesine sahip olsa da kapsamları farklıdır.
<script>
function greeting(message) {
return function(name){
return message + ' ' + name;
}
}
var sayHi = greeting('Merhaba');
var sayHello = greeting('Selam');
console.log(sayHi('Kamil')); // Merhaba Kamil
console.log(sayHello('Kamil')); // Selam Kamil
</script>
Closure JavaScripte implementasyon detayını saklamak için kullanılabilir. Yani fonksiyon dışından erişilemeyen (private) değişkenler ve fonksiyonlar tanımlanabilir.
<script>
function Counter(){
var privateCounter = 0;
function changeBy(val) {
privateCounter += val;
}
return {
increment: function() {
changeBy(1);
},
decrement: function() {
changeBy(-1);
},
value: function() {
return privateCounter;
}
};
};
var mySuperCounter = Counter();
console.log(mySuperCounter.value());
mySuperCounter.increment();
mySuperCounter.increment();
console.log(mySuperCounter.value());
mySuperCounter.decrement();
console.log(mySuperCounter.value());
</script>