JavaScript'te Global Sayaç Değişkeni
Değişkeni num fonksiyonların dışına alalım,
böylece onu global yapalım:
let num = 1; // global değişken
function test() {
return function() {
console.log(num);
num++;
};
}
Bu durumda, döndürülen tüm fonksiyonlar bu global değişkeni değiştirecek ve sayaçlar artık birbirine bağımlı çalışacak:
let num = 1;
function test() {
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // ilk sayaç
func1(); // 1 yazdırır
func1(); // 2 yazdırır
let func2 = test(); // ikinci sayaç
func2(); // 3 yazdırır
func2(); // 4 yazdırır
Peki önceki kodumuz neden bağımsız sayaçlar yapıyordu? Bu kodu hatırlatayım:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
};
Olay şu ki, num değişkeni
test fonksiyonunun içinde yerel (lokal)
bir değişkendir. Bu nedenle her
test çağrısı kendi yerel
değişkenini oluşturur.
Bu nedenle, döndürülen fonksiyonların her biri
test fonksiyonunun kendi yerel değişkenine
referans gösterecektir. Bağımsız çalışma
tam olarak bu şekilde sağlanır.
num değişkenini global bir değişken yapmak
- bu da bir closure'dur. Sadece, döndürülen
fonksiyonların sözlüksel ortamları (lexical environments)
aynı num değişkenine referans gösterir -
bu değişkendeki herhangi bir değişiklik
tüm fonksiyonlarda görülebilir olacaktır.
Kodu çalıştırmadan, konsola ne yazdırılacağını belirleyin:
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Kodu çalıştırmadan, konsola ne yazdırılacağını belirleyin:
function test() {
let counter = 0;
return function() {
return function() {
console.log(counter);
counter++;
};
};
}
let func = test()();
let func1 = func;
let func2 = func;
func1();
func2();
func1();
func2();
Kodu çalıştırmadan, konsola ne yazdırılacağını belirleyin:
function test() {
let counter = 0;
return function() {
return function() {
console.log(counter);
counter++;
};
};
}
let func = test();
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();