Closure giữ tham chiếu đến scope ngoài, ngăn garbage collector giải phóng bộ nhớ. Vấn đề xảy ra khi closure không cần thiết giữ tham chiếu đến đối tượng lớn hoặc DOM node đã bị xóa.
Ví dụ điển hình: event listener không được xóa giữ reference đến component đã unmount:
function setup() {
const largeData = new Array(1000000); // dữ liệu lớn
window.addEventListener("resize", () => {
console.log(largeData.length); // closure giữ largeData
});
// largeData không được GC vì event listener còn sống
}Phòng tránh: gọi removeEventListener khi không cần, null hóa tham chiếu, dùng WeakRef/WeakMap cho cache.
Closures hold references to the outer scope, preventing garbage collection. Problems arise when unnecessary closures hold large objects or removed DOM nodes.
Classic example: an event listener that is never removed keeps a component reference alive:
function setup() {
const largeData = new Array(1000000);
window.addEventListener("resize", () => {
console.log(largeData.length); // closure keeps largeData alive
});
// largeData is never GC'd because the listener survives
}Prevention: call removeEventListener when done, null out references, use WeakRef/WeakMap for caches.