Variabel Global Penghitung dalam JavaScript

Mari letakkan variabel num di luar fungsi, sehingga menjadikannya global:

javascriptlet num = 1; // variabel global

function test() {
  return function() {
    console.log(num);
    num++;
  };
}

Dalam kasus ini, semua fungsi yang dikembalikan akan mengubah variabel global ini dan penghitung akan bekerja saling bergantung satu sama lain:

javascriptlet num = 1;

function test() {
  return function() {
    console.log(num);
    num++;
  };
}

let func1 = test(); // penghitung pertama
func1();  // akan menampilkan 1
func1();  // akan menampilkan 2

let func2 = test(); // penghitung kedua
func2();  // akan menampilkan 3
func2();  // akan menampilkan 4

Mengapa kode kita sebelumnya membuat penghitung yang independen? Izinkan saya mengingatkan kode ini:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
    num++;
  };
};

Masalahnya adalah variabel num bersifat lokal di dalam fungsi test. Oleh karena itu, setiap pemanggilan test menghasilkan variabel lokalnya sendiri.

Jadi, fungsi-fungsi yang dikembalikan akan merujuk masing-masing ke variabel lokal fungsi test. Dengan cara inilah independensi kerja tercapai.

Jika num dijadikan variabel global - ini juga merupakan closure. Hanya saja, lingkungan leksikal dari fungsi-fungsi yang dikembalikan merujuk pada variabel num yang sama - perubahan apapun pada variabel ini akan terlihat di semua fungsi.

Задание 1

Tentukan, tanpa menjalankan kode, apa yang akan ditampilkan di konsol:

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

Tentukan, tanpa menjalankan kode, apa yang akan ditampilkan di konsol:

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

Tentukan, tanpa menjalankan kode, apa yang akan ditampilkan di konsol:

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