Tôi bị rò rỉ bộ nhớ mà tôi không hiểu. Tôi đã lập trình một cơ chế để xử lý sự kiện với tính năng tự động bán tự động, cho phép tôi dọn dẹp bộ nhớ dễ dàng. Nhưng trong một trường hợp, việc dọn dẹp không xảy ra (tôi sử dụng "hồ sơ (bộ nhớ heap)" của chrome để kiểm tra các phiên bản "EventHandler" bên trái). Tôi thực sự không hiểu tại sao nó lại xảy ra. Có điều gì đó kỳ lạ với việc đóng cửa ...Đóng cửa Javascript: Memory Leak
function Bind(obj, f) {
return function() {
return f.apply(obj, arguments);
}
}
function EventHandler() {
this.listeners = new Object();
var _listenerID = 0;
this.addListener = function(e, obj, listener, specialDisplay) {
if (typeof(listener) === "function") {
var listenerID = ++_listenerID;
console.log("Events (" + (++EventHandler.All) + ", " + listenerID + ") ++" + e);
if (!this.listeners.hasOwnProperty(e)) {
this.listeners[e] = new Object();
}
this.listeners[e][listenerID] = listener;
if (obj != null && typeof(obj.removeListener) == "function") {
var deleteListenerID = obj.addListener("Delete", null, Bind(this, function() {
this.removeListener(e, listenerID);
obj.removeListener("Delete", deleteListenerID);
}));
}
return listenerID;
}
return null;
}
this.fire = function(e, obj) {
if (this.listeners.hasOwnProperty(e)) {
for(var i in this.listeners[e]) {
this.listeners[e][i](obj);
}
}
}
this.removeListener = function(e, listenerID) {
if (this.listeners.hasOwnProperty(e) && this.listeners[e].hasOwnProperty(listenerID)) {
delete this.listeners[e][listenerID];
console.log("Events (" + (--EventHandler.All) + ", " + listenerID + ") --" + e);
}
}
}
EventHandler.All = 0;
function Loader() {
}
Loader.files = new Object();
Loader.LoadImage = function(src, f) {
if (!Loader.files.hasOwnProperty(src)) {
var handler = new EventHandler();
console.log("Loading.... (" + src + ")");
Loader.files[src] = function(fnct) {
handler.addListener("ImageLoaded", handler, function(img) {
fnct(img);
});
}
handler.addListener("ImageLoaded", handler, function() {
Loader.files[src] = function(fnct) {
fnct(img);
}
});
var img = new Image();
$(img).load(function() {
console.log("Loaded.... (" + src + ")");
handler.fire("ImageLoaded", img);
handler.fire("Delete");
$(img).unbind('load');
});
img.src = src;
}
Loader.files[src](f);
}
Loader.LoadImage("http://serge.snakeman.be/Demo/house.jpg", function() { alert("ok"); });
Bạn có thể làm như thông báo lỗi nói và dán mã từ jsfiddle vào câu hỏi. Cảm ơn. – JJJ
Tôi thực sự không biết những gì một phần của mã sẽ là có ý nghĩa hơn tôi đã thực sự một chút bối rối bởi cảnh báo stackoverflow. – Serge
Nếu ai đó có thể upvote câu hỏi của tôi, tôi sẽ cấp 50 tiền thưởng cho câu trả lời ... – Serge