JavaScript’te “scope” ve “closure” kavramları

JavaScript’te scope ve closure, kodunuzu doğru bir şekilde yazmanız için bilmeniz gereken önemli kavramlardır. Bu kavramlar kabaca değişkenlerin ve fonksiyonların nasıl kullanıldığına ve nerede tanımlandığına dair kuralları belirler diyebiliriz.

İlk önce sırayla bu kavramların kısaca bir tanımını yapıp örnek kodlar üzerinde ne işe yaradıklarını gösterelim.

Scope nedir?

Scope (kapsam), bir programda değişkenlerin ve fonksiyonların erişebilir olduğu alanları ifade eder.

JavaScript’te kaç tür scope vardır?

JavaScript’te iki tür scope vardır: global scope (genel kapsam) ve local scope (yerel kapsam)

Global scope nedir?

Global scope (genel kapsam), kodun herhangi bir yerinde tanımlanmış olan değişkenlerin ve fonksiyonların tüm kodda erişilebilir olması durumudur.

Local scope nedir?

Local scop (yerel kapsam), bir fonksiyonun veya bloğun içinde tanımlanan değişkenlerin yalnızca o fonksiyon veya blok içinde erişilebilir olmasıdır.

⭐ JavaScript’te lobal scope kullanımı:

Yukarıdaki örnekte globalVariable olarak adlandırılan değişkenimiz global bir değişken olarak tanımlanmıştır ve sayHello() fonksiyonunda kullanılmıştır. sayHello() fonksiyonu herhangi bir problem yaşamadan global scope’da tanımlandığı için globalVariable değişkenine erişebilmiştir.

⭐ JavaScript’te her bir fonksiyon, kendi kapsamını oluşturur ve bu kapsam ile ilgili fonksiyonun içinde tanımlanan değişkenlere erişilebilirlik belirlenmiş olur.

Örneğin aşağıdaki kodu incelediğinizde, x değişkeni myFunction fonksiyonunun kapsamında tanımlanmıştır ve dolayısıyla sadece myFunction fonksiyonu içinde erişilebilir olmaktadır.

❗ Çoğu programlama dili blok kapsamlıdır, yani her yeni küme parantezi { } ile yeni bir lexical environment (sözcük çerçevesi) oluşturulur. Ancak JavaScript fonksiyon kapsamlıdır, yani yalnızca global kapsamda fonksiyon anahtar kelimesini gördüğünde yeni bir yerel ortam oluşturur.

❗ Local scope (yerel kapsam), sadece fonksiyonlarla sınırlı değildir. İki durumda daha local scope oluşturulur:

➡️ if, for, while gibi kontrol yapıları da kendi içlerinde local scope oluştururlar. Örneğin:

Yukarıdaki örnekte if bloğu içinde message değişkeni tanımlandığı için local scope olmaktadır. if bloğunun dışındaki console.log() çağrısında da message değişkenine erişilebilir.

➡️ ES6 ile birlikte kullanıma sunulan let ve const anahtar kelimeleri blok kapsam oluşturmaktadır. Örneğin:

Yukarıdaki örnekte message değişkeni let anahtar kelimesi ile tanımlanmıştır ve bu nedenle sadece if bloğu kapsamında geçerlidir ve dışarıdan erişilemez. Bu nedenle ikinci console.log() çağrısında ReferenceError hatası alınır.

❗ Buna karşılık var anahtar kelimesi ile oluşturulan değişkenler bir blok içinde görünseler bile fonksiyon kapsamlıdırlar. Örneğin:

Var anahtar kelimesi ile tanımlanan message değişkeni bir blok içinde dahi olsa fonksiyon kapsamlı olduğu için dışarıdan da erişilebilmiştir.

Closure nedir?

JavaScript’te closure (kapama), bir iç fonksiyonun, dış fonksiyonun kapsamındaki değişkenlere erişebilmesi durumudur.

⭐ Closure ile iç fonksiyon, dış fonksiyonun kapsamındaki değişkenleri, dış fonksiyon çalışmasını tamamladıktan sonra bile kullanabilir. Bu nedenle, closure, bir fonksiyonun değişkenleri hatırlamasına ve sonraki çağrılarda bu değişkenleri kullanabilmesine olanak tanıdığından oldukça önemli bir kavramdır.

Yukarıdaki örnekte add isimli bir fonksiyon tanımlanmıştır ve x parametresi almakta ve fonksiyonumuz içinde bir fonksiyon döndürmektedir. Döndürülen fonksiyon, add fonksiyonunun bir değişkeni olan x‘i hatırlayabilir (işte tam bu noktada closure özelliği devreye girmiştir).

Daha sonra add(5) ile çağrıldığında, döndürülen fonksiyon, x değerini 5 olarak hatırlayacak ve add5(3) çağrısı yapıldığında 5 ve 3’ü toplayarak sonuç olarak 8 döndürecektir. Burada x değişkeni, add fonksiyonunun çağrıldığı sırada ortaya çıkan yerel bir değişken olmadığı halde içerideki fonksiyon tarafından kullanılabilmiştir. Böylece, add5 fonksiyonu add fonksiyonundan çıktıktan sonra bile x değişkenine erişebilmektedir.

Umarım JavaScript’teki scope ve closure kavramları net bir şekilde anlaşılmıştır. Eksik, hata veya sormak istediğiniz sorular için yorum bırakabilirsiniz.

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu