Bộ đếm sử dụng Closure trong JavaScript
Hãy viết lại đoạn mã chúng ta đã xem xét
để hàm được trả về mỗi lần
tăng giá trị của biến num
lên một đơn vị:
function test() {
let num = 1;
return function() {
console.log(num);
num++; // thêm một
}
}
let func = test();
Kết quả là mỗi lần gọi hàm func
sẽ in ra console một giá trị mới:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
}
}
let func = test();
func(); //sẽ in ra 1
func(); //sẽ in ra 2
func(); //sẽ in ra 3
func(); //sẽ in ra 4
func(); //sẽ in ra 5
Như vậy, chúng ta đã triển khai một bộ đếm số lần gọi
hàm, sử dụng closure (chính xác hơn là sử dụng
biến num từ closure của hàm chúng ta).
Lưu ý rằng mỗi lần gọi hàm test
sẽ trả về một hàm mới, mà
sẽ có closure riêng của nó. Có nghĩa là các bộ đếm khác nhau
sẽ hoạt động độc lập:
function test() {
let num = 1;
return function() {
console.log(num);
num++;
};
}
let func1 = test(); // bộ đếm thứ nhất
func1(); //sẽ in ra 1
func1(); //sẽ in ra 2
let func2 = test(); // bộ đếm thứ hai
func2(); //sẽ in ra 1
func2(); //sẽ in ra 2
Như vậy, cùng một biến num
cho các hàm khác nhau sẽ có giá trị khác nhau!
Có nghĩa là nếu chúng ta gọi hàm test
hai lần, thì các hàm nhận được từ nó sẽ
hoạt động một cách độc lập và mỗi
hàm trong số này sẽ có biến num
độc lập của riêng nó.
Tự mình, không nhìn vào mã của tôi, hãy triển khai bộ đếm số lần gọi hàm, hoạt động dựa trên closure.
Giả sử hàm trong closure lưu trữ số 10.
Hãy làm sao để mỗi lần gọi hàm
giảm số này đi 1 và in
ra console số đã giảm.
Hãy sửa đổi bài toán trước đó sao cho
việc đếm ngược đạt đến 0, sau đó mỗi
lần gọi hàm tiếp theo in ra console
thông báo rằng việc đếm ngược đã kết thúc.