JavaScript'te Global Sayaç Değişkeni

Değişkeni num fonksiyonların dışına alalım, böylece onu global yapalım:

javascriptlet 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:

javascriptlet 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:

javascriptfunction 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.

Задание 1

Kodu çalıştırmadan, konsola ne yazdırılacağını belirleyin:

javascriptlet counter = 0;
    
function test() {
  return function() {
    console.log(counter);
    counter++;
  };
}

let func = test;

let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Задание 2

Kodu çalıştırmadan, konsola ne yazdırılacağını belirleyin:

javascriptfunction 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();
Задание 3

Kodu çalıştırmadan, konsola ne yazdırılacağını belirleyin:

javascriptfunction 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();