Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Timer/Callback quên (Forgotten timers) gây rò rỉ bộ nhớ trong JavaScript


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

  1. Đưa reference vào trong setInterval/setTimeout để function có thể GC khi không cần.
  2. 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.