JavaScript Kapanışları
JavaScript değişkenleri yerel veya global kapsama ait olabilir.
Global değişkenler, kapanışlar ile yerel (özel) hale getirilebilir .
Genel Değişkenler
A , fonksiyon içindefunction
tanımlanan tüm değişkenlere aşağıdaki gibi erişebilir :
Örnek
function myFunction() {
let a = 4;
return a * a;
}
Ancak , aşağıdaki gibi, fonksiyonun dışındafunction
tanımlanan değişkenlere de erişebilir :
Örnek
let a = 4;
function myFunction() {
return a * a;
}
Son örnekte, a global bir değişkendir.
Bir web sayfasında, global değişkenler pencere nesnesine aittir.
Global değişkenler, sayfadaki (ve penceredeki) tüm komut dosyaları tarafından kullanılabilir (ve değiştirilebilir).
İlk örnekte, a yerel bir değişkendir.
Yerel bir değişken sadece tanımlandığı fonksiyon içinde kullanılabilir. Diğer işlevlerden ve diğer komut dosyası kodlarından gizlenmiştir.
Aynı ada sahip global ve yerel değişkenler farklı değişkenlerdir. Birini değiştirmek diğerini değiştirmez.
Bir bildirim anahtar sözcüğü ( ,
, veya ) olmadan oluşturulan değişkenler , bir işlev içinde oluşturulmuş olsalar bile her zaman globaldir.var
let
const
Örnek
function myFunction() {
a = 4;
}
Değişken Ömür
Global değişkenler, başka bir sayfaya gittiğinizde veya pencereyi kapattığınızda olduğu gibi, sayfa atılana kadar yaşar.
Yerel değişkenlerin ömrü kısadır. İşlev çağrıldığında oluşturulurlar ve işlev bittiğinde silinirler.
Bir Karşı İkilem
Bir şeyi saymak için bir değişken kullanmak istediğinizi ve bu sayacın tüm fonksiyonlar için kullanılabilir olmasını istediğinizi varsayalım.
function
Sayacı artırmak için global bir değişken ve a kullanabilirsiniz:
Örnek
// Initiate counter
let counter = 0;
// Function to increment
counter
function add() {
counter += 1;
}
// Call add() 3 times
add();
add();
add();
// The counter should now be 3
Yukarıdaki çözümle ilgili bir sorun var: Sayfadaki herhangi bir kod, add()'ı çağırmadan sayacı değiştirebilir.
add()
Diğer kodun onu değiştirmesini önlemek için sayaç, işlevde yerel olmalıdır :
Örnek
// Initiate counter
let counter = 0;
// Function to increment
counter
function add() {
let counter = 0;
counter += 1;
}
//
Call add() 3 times
add();
add();
add();
//The counter should
now be 3. But it is 0
Yerel sayaç yerine global sayacı görüntülediğimiz için işe yaramadı.
Global sayacı kaldırabilir ve fonksiyonun onu döndürmesine izin vererek yerel sayaca erişebiliriz:
Örnek
// Function to increment
counter
function add() {
let counter = 0;
counter += 1;
return counter;
}
//
Call add() 3 times
add();
add();
add();
//The counter should
now be 3. But it is 1.
Fonksiyonu her çağırdığımızda yerel sayacı sıfırladığımız için işe yaramadı.
Bir JavaScript iç işlevi bunu çözebilir.
JavaScript İç İçe İşlevler
Tüm işlevlerin global kapsama erişimi vardır.
Aslında, JavaScript'te tüm işlevlerin "yukarıdaki" kapsama erişimi vardır.
JavaScript iç içe işlevleri destekler. İç içe geçmiş işlevlerin "yukarıdaki" kapsama erişimi vardır.
Bu örnekte, iç işlevin üst işlevdeki değişkene plus()
erişimi vardır :counter
Örnek
function add() {
let counter = 0;
function plus() {counter += 1;}
plus();
return counter;
}
plus()
Fonksiyona dışarıdan ulaşabilseydik, bu karşıt ikilemi çözebilirdi .
counter = 0
Ayrıca yalnızca bir kez yürütmenin bir yolunu bulmamız gerekiyor .
Bir kapanışa ihtiyacımız var.
JavaScript Kapanışları
Kendi kendine çağrılan işlevleri hatırlıyor musunuz? Bu işlev ne yapar?
Örnek
const add = (function () {
let counter = 0;
return function () {counter += 1; return counter}
})();
add();
add();
add();
// the counter is now 3
Örnek Açıklama
Değişken add
, kendi kendini çağıran bir işlevin dönüş değerine atanır.
Kendi kendini çağırma işlevi yalnızca bir kez çalışır. Sayacı sıfır (0) olarak ayarlar ve bir işlev ifadesi döndürür.
Bu şekilde add bir fonksiyon haline gelir. "Harika" kısım, üst kapsamdaki sayaca erişebilmesidir.
Buna JavaScript kapatma denir . Bir fonksiyonun " özel " değişkenlere sahip olmasını mümkün kılar .
Sayaç, anonim işlevin kapsamı tarafından korunur ve yalnızca ekleme işlevi kullanılarak değiştirilebilir.
Kapatma, üst işlev kapandıktan sonra bile üst kapsama erişimi olan bir işlevdir.