Pembolehubah Pembilang Global dalam JavaScript
Mari letakkan pembolehubah num di luar fungsi,
sekaligus menjadikannya global:
let 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:
let 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:
function 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.
Tentukan, tanpa menjalankan kod, apakah yang akan dipaparkan dalam konsol:
let counter = 0;
function test() {
return function() {
console.log(counter);
counter++;
};
}
let func = test;
let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();
Tentukan, tanpa menjalankan kod, apakah yang akan dipaparkan dalam konsol:
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();
Tentukan, tanpa menjalankan kod, apakah yang akan dipaparkan dalam konsol:
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();