Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript XMLHttpRequest何时解除分配?_Javascript_Ajax_Xmlhttprequest_Javascript Objects - Fatal编程技术网

Javascript XMLHttpRequest何时解除分配?

Javascript XMLHttpRequest何时解除分配?,javascript,ajax,xmlhttprequest,javascript-objects,Javascript,Ajax,Xmlhttprequest,Javascript Objects,让我们看看代码(这是整个html页面) 函数ajax\u async(方法、url、正文、cb){ var r=新的XMLHttpRequest(); r、 打开(方法、url、true); r、 onreadystatechange=cb; r、 发送(正文); } ajax_async('GET','/sleep.php',null,function(){ 如果(this.readyState==4)警报('123'); }); sleep.php只需休眠10秒,然后返回 显然,XMLH

让我们看看代码(这是整个html页面)


函数ajax\u async(方法、url、正文、cb){
var r=新的XMLHttpRequest();
r、 打开(方法、url、true);
r、 onreadystatechange=cb;
r、 发送(正文);
}
ajax_async('GET','/sleep.php',null,function(){
如果(this.readyState==4)警报('123');
});
sleep.php只需休眠10秒,然后返回

显然,XMLHttpRequest对象使用了一些内存,如果我们想要长时间使用应用程序页面,应该在使用后释放这些内存。据我所知,javascript使用垃圾收集器释放内存中未使用的项,“未使用”表示“无法访问”


在上面的代码中,变量
r
是本地变量,不能在
ajax\u async()
函数之外访问。但是请求继续工作,回调函数在10秒后调用,因此XMLHttpRequest对象仍然存在,并且没有释放。为什么?readyState变为4后是否会取消分配?若否,将于何时举行?如果是,为什么readyState==4表示“可解除分配”,而其他值表示“可解除分配”,是否在某个位置指定了此值?

r.onreadystatechange
将引用保留在事件队列中。我怀疑
r
是否会在事件被删除之前被垃圾收集。但是事件(接收到的响应)仅在10秒后发生是的,但触发事件不会将其删除,它仍然在那里,可以在需要时再次触发。在过去,当删除元素时,附加到DOM元素的事件是复杂的。这主要是在现代JS引擎中解决的,我假设XHR对象可以并且可以被类似地处理。
<script>
function ajax_async(method, url, body, cb) {
  var r = new XMLHttpRequest();
  r.open(method, url, true);
  r.onreadystatechange = cb;
  r.send(body);
}

ajax_async('GET', '/sleep.php', null, function() {
  if(this.readyState==4) alert('123');
});
</script>