Closure = một hàm giữ tham chiếu tới scope nơi nó được khai báo, nên vẫn đọc/ghi được biến của scope cha ngay cả khi hàm cha đã chạy xong. Nói cách khác, hàm "nhớ" môi trường tạo ra nó.
- Nền tảng của closure là lexical scoping — phạm vi biến xác định lúc viết code, không phải lúc gọi.
- Ứng dụng thường gặp:
- Biến private / đóng gói trạng thái (module pattern, counter, factory function).
- Ghi nhớ giá trị cho callback:
setTimeout, event handler,debounce/throttle. - Currying / partial application.
js
function makeCounter() {
let count = 0 // private — only the returned fn can access it
return () => ++count
}
const next = makeCounter()
next() // 1
next() // 2 — count is still alive after makeCounter returnedLỗi kinh điển: dùng var trong vòng lặp tạo callback → mọi callback cùng chia sẻ một biến.
Sửa bằng let (tạo binding mới mỗi vòng) hoặc IIFE.