我正在编写一个完全由AJAX驱动的浏览器应用程序(我生命中的第一次),这意味着:
我关心的是我应该怎么做XMLHttpRequests,因为我主要是C ++程序员,当你写一个像
这样的语句时,我会被教导x = new XMLHttpRequest();
之后你需要delete
。
这个问题完全是关于内存管理的问题,这个用new
分配的对象是否保留在内存中,即使它在readyState == 4完成它的“循环”之后,或者以某种方式释放,释放,whatchacallit?老实说,我不知道它可以在什么时候被释放,因为创建这些的脚本将在HEAD并且可能整个工作日坐在那里。我是否应该:
请考虑到我的网页的“框架”将保留,请将您的答案包括在哪些内容以及为什么要删除这些对象,如果他们愿意的话。希望我明确提出这个问题,并感谢任何有见地的答案。
修改
考虑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>不可达?请确认。
答案 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对象的生命周期(将其返回到空闲请求处理程序池或删除它)。