XMLHttpRequest - 使用后释放?

时间:2014-02-04 13:50:14

标签: javascript ajax xmlhttprequest

我正在编写一个完全由AJAX驱动的浏览器应用程序(我生命中的第一次),这意味着:

  • 它将是一个停留在浏览器中的页面,根据需要加载程序组件
  • 浏览器历史记录将是,没有。
  • 页面根本不会刷新

我关心的是我应该怎么做XMLHttpRequests,因为我主要是C ++程序员,当你写一个像

这样的语句时,我会被教导
x = new XMLHttpRequest();

之后你需要delete

这个问题完全是关于内存管理的问题,这个用new分配的对象是否保留在内存中,即使它在readyState == 4完成它的“循环”之后,或者以某种方式释放,释放,whatchacallit?老实说,我不知道它可以在什么时候被释放,因为创建这些的脚本将在HEAD并且可能整个工作日坐在那里。我是否应该:

  • 创建一个或多个XMLHttpRequest类型的重用对象,对应用程序进行编程,使其不需要超过此限制,
  • 或者没关系,我可以分配尽可能多的新XMLHttpRequests吗?

请考虑到我的网页的“框架”将保留,请将您的答案包括在哪些内容以及为什么要删除这些对象,如果他们愿意的话。希望我明确提出这个问题,并感谢任何有见地的答案。

修改

考虑onClick事件处理程序的代码(我删除了许多正在检查意外返回值的行),创建XMLHttpRequest并发送它:

function submitme(){  
  var p = document.getElementById('p'); //a text field being sent to server
  if(typeof p!='undefined' && p!=null){
    if(p.value!=""){
      //here XMLHttpRequest is created, this function
      //returns exactly object of this type or false, when failed
      var xhr=createXmlHttpRequestObject();
      if(xhr!=false){
        xhr.open("POST", "blablabla.php", true);
        xhr.onreadystatechange=function(){
          if(xhr.readyState==4){
             if(xhr.status==200){
               //result will be posted in this div below
               var adiv = document.getElementById('resultdiv');
               //extract the XML retrieved from the server
               xmlResponse = xhr.responseXML;
               //obtain the document element (the root element) of the XML structure
               xmlDocumentElement = xmlResponse.documentElement;
               //get the response text
               if(typeof adiv !='undefined' && adiv != null){
                  adiv.innerHTML=xmlDocumentElement.childNodes[0].firstChild.nodeValue;
               }
             }//end xhr.status
           }//end xhr.readyState
         };//end xhr.onreadystatechange
         xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
         xhr.send(p.value);
       }//end xhr!=false
     }//end p.value!=""
   }//end typeof p!='undefined'
 }//end submitme()

当创建XMLHttpRequest对象实例时,如果触发此处理程序,它将被xhr变量引用一次,直到处理程序完成执行。此时此对象实例有多少引用?如果我理解你的答案中链接正确的文章,答案应该是 none ,浏览器只是等待这个请求转readystate==4,完成执行onreadystatechange函数,对象是< EM>不可达?请确认。

5 个答案:

答案 0 :(得分:6)

我最近遇到了同样的问题,我在互联网上发现我不应该担心任何问题,因为它是垃圾收集的。好吧,你应该有顾虑,因为如果你第一次使用它就很容易留下一些参考文献。

参见本页:

http://javascript.info/tutorial/memory-leaks

并向下滚动到&#34; XmlHttpRequest ...&#34;

基本上说的是什么:

IF 每次都创建一个新的xhr对象(不要重复使用) AND 捕获相应onreadystatechange回调的闭包中的每个xhr对象 THEN < / strong> xhr对象永远不会被垃圾收集,并且内存泄漏会增加。

要避免这种情况,请使用 this 访问xhr对象(例如检查状态),并从闭包中获取xhr。

答案 1 :(得分:2)

JavaScript有一个自动内置垃圾收集器。

您可能需要阅读this文章:

答案 2 :(得分:2)

JavaScript有garbage collection,只是让对XHR对象的引用超出范围,它应该自动清理。

答案 3 :(得分:2)

http://xhr.spec.whatwg.org/#garbage-collection - 这是您问题的答案。这是规范的一部分(如何实现它,但这并不是100%确定它是如何在所有浏览器中实现的),更深入地了解它建议您阅读漏洞文档

  

如果XMLHttpRequest对象的状态为OPENED并且设置了send()标志,其状态为HEADERS_RECEIVED,或者其状态为LOADING,则不能对其进行垃圾回收,并且以下之一为真:

     

它有一个或多个已注册的事件侦听器,其类型为readystatechange,progress,abort,error,load,timeout或loadend。

     

取消设置上传完成标志,并且关联的XMLHttpRequestUpload对象具有一个或多个已注册的事件侦听器,其类型为progress,abort,error,load,timeout或loadend。

     

如果XMLHttpRequest对象在其连接仍处于打开状态时被垃圾收集,则用户代理必须终止该请求。

答案 4 :(得分:0)

就对象生命周期而言,

XMLHttpRequest并不特别。与任何其他对象一样,当您删除最后一个引用时,它将被垃圾收集。

XMLHttpRequest可能不常见或不熟悉的事情是您需要确保Ajax请求正常工作的生命周期。

基本上,您需要在基础Ajax请求的所有生命周期内拥有一个实时XMLHttpRequest对象。

请求完成后,您可以自由删除该对象或将其重新用于其他查询 这种情况经常被那些不想打扰内存管理的人使用:)。

如果您需要同时拥有多个请求,则需要多个XMLHttpRequest个对象 在这种情况下,您可能希望更精确地管理每个XMLHttpRequest对象的生命周期(将其返回到空闲请求处理程序池或删除它)。