Variabel Global Penghitung dalam JavaScript
Mari letakkan variabel num di luar fungsi,
sehingga menjadikannya global:
let 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:
let 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:
function 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.
Tentukan, tanpa menjalankan kode, apa yang akan ditampilkan di 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 kode, apa yang akan ditampilkan di 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 kode, apa yang akan ditampilkan di 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();