Closure và Gọi Hàm Ngay Lập Tức trong JavaScript

Như bạn đã biết, có thể gọi một hàm ẩn danh ngay lập tức và gán kết quả của nó cho một biến nào đó:

javascriptlet result = function() {
  return '!';
}();

console.log(result); // sẽ in ra '!'

Thường thì hàm được gọi ngay lập tức, trong trường hợp như vậy, được đặt trong dấu ngoặc đơn, mặc dù điều này không thực sự cần thiết. Việc này được thực hiện để có thể thấy ngay rằng hàm đang được gọi ngay lập tức:

javascriptlet result = (function() {
  return '!';
})();

console.log(result); // sẽ in ra '!'

Bây giờ hãy để kết quả của hàm được gọi ngay lập tức là một hàm ẩn danh:

javascriptlet func = (function() {
  return function() {
    console.log('!');
  }
})();

func(); // sẽ in ra '!'

Hãy làm sao để hàm được trả về lưu trữ biến num trong closure:

javascriptlet func = (function() {
  let num = 1;
  
  return function() {
    console.log(num);
  }
})();

Nếu thêm num++ vào, thì hàm func sẽ trở thành một bộ đếm hoàn chỉnh:

javascriptlet func = (function() {
  let num = 1;
  
  return function() {
    console.log(num);
    num++;
  }
})();

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
Задание 1

Không nhìn vào code của tôi, hãy tự mình thực hiện một bộ đếm tương tự.

Задание 2

Hãy sửa đổi hoạt động của bộ đếm sao cho nó đếm đến 5, sau đó bắt đầu đếm lại từ đầu.