同步AJAX调用如何导致内存泄漏?

Joh*_*olu 32 javascript ajax jquery

我理解这种使用同步ajax调用的一般建议,因为同步调用会阻止UI呈现.

通常给出的另一个原因是具有同步 AJAX的内存泄漏问题.

来自MDN文档 -

注意:您不应该使用同步XMLHttpRequests,因为由于网络固有的异步特性,在使用同步请求时,内存和事件可能会以各种方式泄漏.唯一的例外是同步请求在Workers内部运行良好.

同步调用如何导致内存泄漏?

我正在寻找一个实际的例子.关于这个主题的任何文献的任何指针都会很棒.

Esa*_*ija 14

如果XHR 按规范正确实现,那么它不会泄漏:

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

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

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

如果XMLHttpRequest对象在其连接仍处于打开状态时被垃圾收集,则用户代理必须取消此对象打开的任何获取算法实例,丢弃为其排队的任何任务,并丢弃从网络接收的任何其他数据.

因此,在您点击.send()XHR对象(以及它引用的任何内容)后,您将对GC免疫.但是,任何错误或成功都会使XHR进入DONE状态,并再次受GC限制.如果XHR对象是同步或异步则完全没关系.如果再次发出长同步请求,则无关紧要,因为在服务器响应之前,您只会被卡在发送语句中.

但是,根据这张幻灯片,它至少在2012年的Chrome/Chromium中没有正确实现.根据规范,没有必要调用,.abort()因为DONE状态意味着XHR对象应该已经是正常的GCd.

我找不到任何支持MDN声明的证据,我通过twitter联系了作者.