打破关闭

时间:2012-08-19 19:40:45

标签: javascript ajax xmlhttprequest closures

我正在开发一个小的lib /脚本,它将在文档正文中搜索<div src="..."></div>,从指定的src中检索内容(使用XHR)并将内容插入到div中。在进一步讨论之前,让我给你一个编码的努力:

function Include(ele) {
    this.ele = ele;
    this.xhr = new XHR();
    this.xhr.onload = (function(incObj){
        return function(){
            incObj.onload.call(incObj,this);
        }
    })(this);
    this.xhr.open("GET",ele.getAttribute("src"),false);
    this.xhr.send();
}

Include.prototype.XHR = function(){/* code to find a viable xhr object*/}
Include.prototype.onload = function(){/* stuff */}

var inc = new Include(document.getElementById("someId"));

在发生每个XHR请求并处理内容之后,由于关闭,xhr对象不会被销毁,导致创建的Include对象不会被破坏。反过来,这是一个内存泄漏。对于a:几乎没有包含请求,b:这些请求的内容很少,但随着包含的增加和响应内容的增加,你可以稳定地看到内存使用量的增加,这并不是什么大问题。我将如何打破关闭(或使用可靠的工作,而不依赖于使用全局变量,obj等)来修复此泄漏?

(请不要建议使用库,即使我正在处理的是浏览器js,我的问题更多地适用于javascript本身的工作方式)

1 个答案:

答案 0 :(得分:2)

你可以试试这个:

this.xhr.onload = (function(incObj){
    return function(){
        incObj.onload.call(incObj,this);
        incObj.xhr.onload = null;
    }
})(this);

如果您还有其他事件处理程序,则在您不再需要该对象时也应该将它们处理掉。