function(foo, cb) {
var bigObject = new BigObject();
doFoo(foo, function(e) {
if (e.type === bigObject.type) {
cb();
// bigObject = null;
}
});
}
Ví dụ trên cho thấy đóng cửa rò rỉ bộ nhớ cổ điển, ngẫu nhiên (hoặc có thể không). Bộ thu gom rác V8 không thể xác định xem có an toàn để xóa bigObject
vì nó đang được sử dụng trong chức năng gọi lại có thể được gọi nhiều lần không.Sự rò rỉ bộ nhớ và bộ nhớ gọi lại trong javascript
Một giải pháp là đặt bigObject
thành null
khi công việc trong chức năng gọi lại kết thúc. Nhưng nếu bạn đang sử dụng nhiều biến (hãy tưởng tượng có n
biến như bigObject
và tất cả chúng đều được sử dụng trong gọi lại) thì việc làm sạch này trở thành một vấn đề xấu.
Câu hỏi của tôi là: có cách nào khác để làm sạch các biến được sử dụng không?
EDIT Đây là ví dụ khác (thế giới thực): Vì vậy, tôi nhận được ứng dụng từ mongodb và so sánh nó với một số ứng dụng khác. Gọi lại từ mongodb sử dụng ứng dụng biến được xác định trong số đó gọi lại. Sau khi tôi nhận được kết quả từ mongodb tôi trả lại nó cũng như một cuộc gọi lại (vì nó là tất cả async và tôi không thể chỉ viết trở lại). Vì vậy, thực sự nó có thể xảy ra mà tôi tuyên truyền gọi lại tất cả các cách để nguồn ...
function compareApplications(application, condition, callback) {
var model = database.getModel('Application');
model.find(condition, function (err, applicationFromMongo) {
var result = (applicationFromMongo.applicationID == application.applicationID)
callback(result)
}
}
Hãy để tôi hỏi bạn điều này - tại sao điều này là một vấn đề ? Trình xử lý 'change' có nghĩa là được gọi nhiều lần. Vì vậy, làm thế nào bạn sẽ (hoặc GC) bao giờ biết khi nó thực sự là kết thúc của việc sử dụng 'bigObject' trừ khi bạn unbind sự kiện' thay đổi'? Bạn dường như muốn một thể hiện của 'bigObject' để trình xử lý có thể so sánh các loại. Bạn khởi tạo nó một lần, làm giảm tải cho mỗi lần trình xử lý chạy. Nếu bạn muốn nó được dọn dẹp, hãy khởi tạo nó bên trong trình xử lý mỗi lần, hoặc mong đợi nó bị "rò rỉ" bộ nhớ vì đó là cách nó hoạt động. – Ian
Cách sử dụng .one() thay vì .on()? – frenchie
Xin lưu ý rằng tôi đã thay đổi ví dụ. Trong chương trình thế giới thực của tôi, tôi không sử dụng .on. Tôi vượt qua chức năng gọi lại khác. –