【发布时间】:2018-08-12 00:34:45
【问题描述】:
我有这个简单的设置来发出 AJAX 请求,并且在检查内存使用情况时,事件侦听器计数和堆使用会在快速混合按钮时上升。
显然,Chrome 中的事件侦听器计数是预期的,因为 GC 在分析内存时不理会它,但是堆呢?我在这里错过了明显的泄漏吗?
function handleResponse(oReq, success_func) {
return function() {
try {
if (oReq.readyState === XMLHttpRequest.DONE) {
if (oReq.status === 200) {
var data = oReq.responseText;
success_func(data);
}
}
} catch (e) {
console.log('Something went wrong: ' + e.description);
}
}
}
function makeRequest(name, method, data, success_func) {
return function() {
var oReq = new XMLHttpRequest();
oReq.onreadystatechange = handleResponse(oReq, success_func);
oReq.open(method, 'http://localhost:8080/' + name);
oReq.send(data);
}
}
function updateBookList(data) {
console.log(typeof data);
document.getElementById('ajax-content').innerHTML = data;
}
document.getElementById('show-books').addEventListener(
'click', makeRequest('get_books', 'GET', null, updateBookList)
);
【问题讨论】:
-
我不确定该代码是否会导致泄漏。我很好奇你为什么需要在那里关闭?
makeRequest和handleResponse返回闭包有什么好处? -
只是在这里玩,但想法是将它们用于更多请求(例如在其他事件处理程序上)
-
您可以在没有闭包的情况下重用这些函数。也许尝试一下,看看你的堆问题是否消失。
标签: javascript memory-leaks garbage-collection