Forgotten Timers/Callbacks
2 timer JS: setTimeout() (chạy 1 lần sau delay) và setInterval() (chạy lặp lại).
Khi object bị gắn vào timer callback, nó không bị release cho đến khi timeout. Timer tự reset chạy mãi → GC không thể thu gom memory. Đây là nguyên nhân rò rỉ phổ biến.
Ví dụ rò rỉ
<html> <body> <script> for (var i = 0; i < 100000; i++) { var tiedObject = { callAgain: function() { var text = this; var value = setTimeout(function() { text.callAgain(); }, 100000); } }; tiedObject.callAgain(); tiedObject = null; } </script> </body>> </html>
Timer callback giữ tiedObject qua closure text. Dù gán null, timer vẫn chạy và giữ reference → memory leak.
Cách tránh
- Đưa reference vào trong
setInterval/setTimeoutđể function có thể GC khi không cần. - Gọi trực tiếp hàm hủy (clearTimeout/clearInterval) khi không còn cần.
Lưu ý: Browser hiện đại (Chrome, Firefox) và thư viện (jQuery) xử lý nội bộ khá tốt, ít gặp vấn đề này.