JavaScript’te Scope (Kapsam) Nedir?
eminbasbayan

İçindekiler
Bu yazıda neler var?
Yazılım öğrenmeye başladığında en çok kafanı karıştırabilecek konulardan biri scope yani kapsam konusudur. Scope aslında şunu söyler:
“Bir değişkeni nerede tanımlarsan, onu nerelerde kullanabilirsin?”
Bu yazıda adım adım scope mantığını öğreneceğiz.
1. Scope Neden Önemli?
Bir program yazarken değişkenleri (mesela let age = 25;) farklı yerlerde tanımlarız. Ama bu değişkeni her yerde kullanamazsın. Yanlış yerde kullanırsan:
- Program hata verir,
- Beklemediğin sonuçlar çıkar,
- Kodun anlaşılmaz hale gelir.
Bunu şöyle düşün: Bir oda içinde konuştuğunu hayal et. O odada söylediklerini sadece odadakiler duyabilir. Dışarıdaki insanlar senin sesini duyamaz. İşte değişkenlerin dünyası da buna benzer: Hangi odada tanımlandıysan, sadece orada geçerlisin.
2. Scope Türleri
JavaScript’te temelde 4 farklı scope vardır:
- Global Scope
- Function Scope
- Block Scope
- Lexical Scope
Şimdi bunları tek tek inceleyelim.
2.1 Global Scope
Bir değişkeni herhangi bir fonksiyonun veya bloğun dışında tanımlarsan, bu değişken her yerden erişilebilir.
let appName = "ChatApp";
function printApp() {
console.log(appName); // "ChatApp"
}
printApp();
console.log(appName); // "ChatApp"Burada appName globaldir, hem fonksiyonun içinde hem dışında erişilebilir.
Ama dikkat: Fazla global değişken kullanmak kodu bozar. Her yerden ulaşılabildiği için kontrolü zorlaşır.
2.2 Function Scope
Bir fonksiyonun içinde tanımlanan değişken sadece o fonksiyonun içinde geçerlidir. Dışarıdan erişilemez.
function prepareTea() {
let cups = 3;
console.log("Hazırlanan çay:", cups);
}
prepareTea(); // "Hazırlanan çay: 3"
console.log(cups); // HATA: cups tanımlı değilcups değişkeni sadece fonksiyonun içinde yaşar. Fonksiyon dışına çıkınca ortadan kaybolur.
Fonksiyonları küçük makineler gibi düşünebilirsin. İçindeki değişkenler sadece o makinenin parçalarıdır.
2.3 Block Scope
Blok dediğimiz şey, süslü parantez {} ile çevrilmiş alanlardır. Örneğin:
ifbloğufordöngüsüwhiledöngüsü
Eğer bu blokların içinde let veya const ile değişken tanımlarsan, sadece o blokta geçerlidir.
if (true) {
const message = "Merhaba!";
console.log(message); // "Merhaba!"
}
console.log(message); // HATA: message tanımlı değilmessage sadece if bloğunda vardır, dışarıda yoktur.
Ama eğer var kullanırsan durum değişir:
if (true) {
var msg = "Hoş geldin!";
}
console.log(msg); // "Hoş geldin!" → blok dışına taştı!var eski JavaScript’ten kalma bir özelliktir ve block scope’u dikkate almaz. Bu yüzden modern JS’te let ve const kullanmanı tavsiye ederim.
2.4 Shadowing (Gölgeleme)
Aynı isimde bir değişken hem dışarıda hem içeride tanımlanabilir. Bu durumda içteki değişken dıştakini gizler.
let user = "Zeynep";
function login() {
let user = "Ahmet";
console.log("Giriş yapan:", user); // Ahmet
}
login();
console.log("Dışarıdaki:", user); // ZeynepFonksiyon içindeki user, dışarıdakini gölgeler. Ama aslında ikisi farklı değişkenlerdir.
2.5 Scope Chain (Kapsam Zinciri)
JavaScript bir değişkeni ararken şöyle davranır:
- Önce bulunduğu yerde bakar.
- Bulamazsa bir üst kapsama çıkar.
- En tepeye kadar bakar.
- Bulamazsa hata verir.
let city = "İzmir";
function showCity() {
console.log(city);
}
showCity(); // "İzmir"showCity fonksiyonunda city yoktu. JavaScript bir üst kapsama baktı, buldu ve kullandı.
2.6 Lexical Scope (Sözcüksel Kapsam)
Lexical scope, bir fonksiyonun tanımlandığı yere göre dışarıdaki değişkenleri görebilmesi demektir. Yani içeriden dışarıya erişim vardır, ama dışarıdan içeriye erişim yoktur.
function outer() {
const token = "12345";
function inner() {
console.log(token); // "12345"
}
inner();
}
outer();inner fonksiyonu token’a erişebilir çünkü dış kapsama bakabilir. Ama outer fonksiyonu, inner’ın içindeki değişkenlere ulaşamaz.
3. Neden let ve const, var Değil?
varblock scope’u dikkate almaz.- Hatalı kullanımlara yol açar.
- Modern JavaScript’te
letveconstdaha güvenli.
Kural:
- Varsayılan olarak
constkullan. - Eğer değer değişecekse
letkullan. varkullanma.
4. Mini Özet
- Global Scope → Her yerden erişilebilir.
- Function Scope → Sadece fonksiyonun içinde geçerli.
- Block Scope →
letveconstile blok içinde sınırlı. - Shadowing → İçteki değişken dıştakini gizler.
- Scope Chain → JavaScript değişkeni yukarı doğru arar.
- Lexical Scope → İç fonksiyon dıştaki değişkenleri görebilir.
5. Sonuç
Scope kavramı ilk başta karmaşık görünebilir ama aslında çok mantıklıdır:
- Değişkenleri doğru yerde tanımlarsan kodun daha temiz ve güvenli olur.
- Hataları daha kolay bulursun.
- Başkası senin kodunu okuduğunda kolayca anlayabilir.
Unutma: Scope, değişkenlerin dünyasıdır. Hangi değişkenin nerede yaşadığını bilirsen, JavaScript’te çok daha rahat ilerlersin.






