Memory Leaks trong JavaScript
JS là ngôn ngữ garbage-collected: tự cấp phát bộ nhớ khi khai báo biến, tự giải phóng khi không còn tham chiếu. Rò rỉ thường xảy ra ở giai đoạn giải phóng.
1) Biến toàn cục vô tình (Accidental Globals)
Gán giá trị cho biến chưa khai báo (không có var/let/const) → tạo property trên window.
function myArray(arg) { languages = "[javascript,.....]"; } // tạo window.languages
Nguy hiểm hơn: dùng this trong hàm không strict mode:
function myArray(arg) { this.languages = "[javascript,.....]"; } // gán lên window
Biến toàn cục không bao giờ hết scope → GC không thu gom → rò rỉ.
2) Closures
Inner function truy cập biến outer function. Nếu inner function được trả về/giữ tham chiếu, scope outer (kể cả biến không dùng) vẫn được giữ.
var newvalue; function outFun() { var array = new Array(1000000); var value = newvalue; function innFun() { if (value) return array; } return function () {}; } setInterval(function () { newvalue = outFun(); }, 3);
Mỗi lần gọi outFun, mảng lớn 1 triệu phần tử bị giữ trong closure scope → memory leak tích lũy.