Pembolehubah Pembilang Global dalam JavaScript

Mari letakkan pembolehubah num di luar fungsi, sekaligus menjadikannya global:

javascriptlet num = 1; // pembolehubah global

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

Dalam kes ini, semua fungsi yang dipulangkan akan mengubah pembolehubah global ini dan pembilang akan berfungsi secara bergantung antara satu sama lain:

javascriptlet num = 1;

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

let func1 = test(); // pembilang pertama
func1();  // akan output 1
func1();  // akan output 2

let func2 = test(); // pembilang kedua
func2();  // akan output 3
func2();  // akan output 4

Mengapa kod kita sebelumnya membuat pembilang yang bebas? Ingat semula kod ini:

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

Hal ini kerana pembolehubah num adalah setempat (lokal) di dalam fungsi test. Oleh itu, setiap panggilan test menghasilkan pembolehubah setempatnya sendiri.

Oleh itu, fungsi-fungsi yang dipulangkan akan merujuk masing-masing kepada pembolehubah setempat fungsi test. Dengan cara inilah kebebasan operasi dicapai.

Jika num dijadikan pembolehubah global - ia tetap merupakan penutupan (closure). Cuma persekitaran leksikal fungsi-fungsi yang dipulangkan merujuk kepada pembolehubah num yang sama - sebarang perubahan pada pembolehubah ini akan kelihatan dalam semua fungsi.

Задание 1

Tentukan, tanpa menjalankan kod, apakah yang akan dipaparkan dalam 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 kod, apakah yang akan dipaparkan dalam 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 kod, apakah yang akan dipaparkan dalam 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();