Đâu tiên, bạn lấy biến totalPage ra từ state
const { loading, users, page, totalPages, error } = state;
Vì totalPage không phải object hay array nên JS ưu ái copy giá rị của totalPages từ state vào biến totalPages của local luôn.
-> khi totalPage update thì phải cần được copy lại
Tuy nhiên, thân phận totalPage do là một biến local yếu đuối. Nên khi ra khỏi scope của hàm ScrollLoadMore
thì nó cũng tan thành mây khói.
-> Khi hàm ScrollLoadMore mà chạy xong thì biến totalPage cũng bay màu theo.
Nhưng ngặt nỗi, thằng handleScroll
lại gian díu với biến localPage
. Mà thằng handleScroll này lại là có máu mặt, chưa kể nó còn được trọng dụng bởi cụ window với event “scroll” nữa. Nên không trảm nó được. Khổ cái nữa là thằng này sống dựa dẫm vào localPage. Bây giờ con localPage chết là thằng kia cũng tự tử luôn.
-> Nếu vậy thì mỗi khi scroll là ko gọi được hàm handleScroll -> Bị lỗi đỏ lòm, chương trình la làng lên. Người dùng bối rối -> không ai thèm vào website của bạn nữa -> bạn thất bại -> bạn chán đời -> bạn suy nghĩ về những thứ tiêu cực
Thế thì làm sao bây giờ? Thì ông chú JS mới nghĩ ra thuật ngữ closure. Tức là một phép màu giúp một hàm, vẫn truy cập được giá trị của 1 biến. Cho dù biến đó đã ra khỏi scope. Phép màu như thế nào thì chúng ta không nên quan tâm. Chỉ biết vậy là đủ
Thì, chương trình của bạn khi nó render xong nó thoát khỏi hàm. Khi này giá trị của totalPage ở trong hàm handleScroll như một bản sao trước đó. Không phải là biến đó nữa. Mà bản sao thì làm sao được update như bản chính. Giống như mua đồ fake thì sao mà được bảo hành chính hãng. Thế là hàm handleScroll vẫn giữ hoài hình bóng đó. Dẫn tới việc in ra bị sai.