Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
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; 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:
KapsamNerede oluşur?Temel sınır
GlobalKlasik script’in üst düzeyiAynı global ortamda erişim
ModülJavaScript modülünün üst düzeyiPaylaşım için export/import gerekir
FonksiyonFonksiyon gövdesiYerel adlar dışarıdan okunamaz
Bloklet/const içeren süslü parantezli bölümBlok dışına doğrudan çıkmaz
Örneğin 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:
  1. Değişkenin nerede kullanılacağını belirleyin.
  2. Kapsamı mümkün olduğunca dar tutun; yalnızca ihtiyaç duyulan blokta veya fonksiyonda tanımlayın.
  3. Değer sabitse const, değişkense let seçin.
  4. 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.

Sık sorulan sorular​

typeof neden bazen undefined, bazen ReferenceError verir?​

Hiç tanımlanmamış bir ad için typeof sonucu undefined metni olabilir. Ancak aynı kapsamda let veya const ile tanımlanacak ada, başlatılmadan önce temporal dead zone içinde erişmek typeof ile de ReferenceError doğurur. Bu iki durumu değişkenin yalnız değerinin boş olmasıyla karıştırmayın.

Global let neden window üzerinde görünmeyebilir?​

Tarayıcıdaki klasik script ortamında üst düzey let ve const bağları global nesnenin özelliği olarak eklenmez. Bu yüzden bir ada doğrudan erişebilmekle window veya globalThis üzerinde aynı adlı özellik bulmak aynı kontrol değildir. Modül üst düzeyi ise zaten modül kapsamındadır.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic