- Konu sahibi
- #1
JavaScript'te scope, bir değişkenin nereden erişilebilir olduğunu belirleyen kapsamdır. Bir değişkene tanımlandığı kapsamdan ve onun içindeki alt kapsamlardan erişilebilir. Dış kapsam, iç fonksiyonun yerel değişkenini doğrudan göremez. Scope kurallarını bilmek;
JavaScript'te temel kapsam türleri global, modül, fonksiyon ve blok kapsamıdır. Modern kodda değişken tanımlarken genellikle
JavaScript bir değişkeni ararken önce mevcut kapsamda arama yapar. Bulamazsa dış kapsama, sonra onun dışındaki kapsama geçer. Bu arama global kapsama kadar sürer. Normal bir değişken okumasında ad hiçbir kapsamda bulunamazsa
Bir fonksiyon, oluşturulduğu dış kapsamındaki değişkenlere erişebilir. Buna closure davranışı denir. Ancak dış kapsam, iç fonksiyonun içindeki değişkenlere erişemez.
Bu örnekte
Aşağıdaki tablo değişkenin hangi sınır içinde tanımlandığını ayırır:
Örneğin
Aynı örnekte
Bu iki farklı bağdır. Değişken adları aynı olsa da örnek, dıştaki const değerini değiştirmez. Modülün üst düzeyindeki var dahil bildirimler de kendiliğinden bütün uygulamanın global değişkenleri olmaz. Başka bir modülden erişim gerekiyorsa açık bir dışa aktarma ve içe aktarma ilişkisi kurun.
Pratik kontrol sırası şöyledir:
Blok dışından değişkene erişmek:
var ile döngü değişkeni kullanmak:
Tanımlamadan önce let veya const okumak: Bu değişkenler kapsam içinde bulunsalar bile tanım satırı çalışmadan önce kullanılmaları
Global değişkenleri çoğaltmak: Her yerden erişilebilen global değişkenler isim çakışmalarını ve beklenmeyen değişiklikleri artırır. Veriyi mümkün olan en dar fonksiyon veya blok kapsamında tutun.
ReferenceError hatalarını, aynı isimli değişkenlerin birbirini gölgelemesini ve döngülerde oluşan beklenmedik sonuçları önler.JavaScript'te temel kapsam türleri global, modül, fonksiyon ve blok kapsamıdır. Modern kodda değişken tanımlarken genellikle
const, gerektiğinde let kullanılmalıdır. var ise blok kapsamına sahip olmadığı için özellikle if ve for içinde şaşırtıcı sonuçlara yol açabilir.Scope nasıl çalışır?
JavaScript bir değişkeni ararken önce mevcut kapsamda arama yapar. Bulamazsa dış kapsama, sonra onun dışındaki kapsama geçer. Bu arama global kapsama kadar sürer. Normal bir değişken okumasında ad hiçbir kapsamda bulunamazsa
ReferenceError oluşur; typeof için ayrı bir istisna vardır.Bir fonksiyon, oluşturulduğu dış kapsamındaki değişkenlere erişebilir. Buna closure davranışı denir. Ancak dış kapsam, iç fonksiyonun içindeki değişkenlere erişemez.
Kod:
const siteName = "example.com";
function showSite() {
const message = "Site: " + siteName;
return message;
}
console.log(showSite());
// Beklenen çıktı: Site: example.com
console.log(message);
// ReferenceError: message is not defined
Bu örnekte
showSite fonksiyonu global kapsamdaki siteName değişkenini okuyabilir. Fakat message yalnızca fonksiyon kapsamında bulunduğu için fonksiyonun dışından okunamaz.Kapsam sınırları
Aşağıdaki tablo değişkenin hangi sınır içinde tanımlandığını ayırır:
| Kapsam | Nerede oluşur? | Temel sınır |
|---|---|---|
| Global | Klasik script’in üst düzeyi | Aynı global ortamda erişim |
| Modül | JavaScript modülünün üst düzeyi | Paylaşım için export/import gerekir |
| Fonksiyon | Fonksiyon gövdesi | Yerel adlar dışarıdan okunamaz |
| Blok | let/const içeren süslü parantezli bölüm | Blok dışına doğrudan çıkmaz |
let ve const ile oluşturulan değişkenler süslü parantezlerle ayrılan bloktan dışarı çıkmaz:
Kod:
if (true) {
const inside = "blok içinde";
let count = 1;
console.log(inside, count);
}
console.log(inside);
// ReferenceError: inside is not defined
Aynı örnekte
var kullanılsaydı değişken blok dışından da görünür olurdu:
Kod:
if (true) {
var visible = "blok dışından görünür";
}
console.log(visible);
// Beklenen çıktı: blok dışından görünür
Dış değişkeni değiştirmek ile gölgelemek
İç kapsamda aynı adla yeni bir değişken tanımlamak dıştaki değeri yeniden atamak değildir. İçerideki ad, dıştaki adı o kapsamda gölgeler. Hangi değerin kullanılacağını fonksiyonun nereden çağrıldığı değil, kodun oluşturulduğu sözcüksel kapsam belirler.
JavaScript:
const alan = "dis";
function ornek() {
const alan = "ic";
console.log(alan);
}
ornek(); // ic
console.log(alan); // dis
Bu iki farklı bağdır. Değişken adları aynı olsa da örnek, dıştaki const değerini değiştirmez. Modülün üst düzeyindeki var dahil bildirimler de kendiliğinden bütün uygulamanın global değişkenleri olmaz. Başka bir modülden erişim gerekiyorsa açık bir dışa aktarma ve içe aktarma ilişkisi kurun.
Pratik kontrol sırası şöyledir:
- Değişkenin nerede kullanılacağını belirleyin.
- Kapsamı mümkün olduğunca dar tutun; yalnızca ihtiyaç duyulan blokta veya fonksiyonda tanımlayın.
- Değer sabitse
const, değişkenseletseçin. - Hata alırsanız değişkenin tanımlandığı blok, fonksiyon veya modül sınırını kontrol edin.
Sık yapılan hatalar
Blok dışından değişkene erişmek:
let veya const ile blok içinde tanımlanan değişken dışarıdan okunamaz.var ile döngü değişkeni kullanmak:
var blok kapsamlı olmadığı için döngü sonrasında hâlâ erişilebilir olabilir. Modern kodda döngü değişkeni için let kullanmak daha güvenlidir.Tanımlamadan önce let veya const okumak: Bu değişkenler kapsam içinde bulunsalar bile tanım satırı çalışmadan önce kullanılmaları
ReferenceError oluşturabilir. Değişkeni kullanmadan önce tanımlayın.Global değişkenleri çoğaltmak: Her yerden erişilebilen global değişkenler isim çakışmalarını ve beklenmeyen değişiklikleri artırır. Veriyi mümkün olan en dar fonksiyon veya blok kapsamında tutun.