Jquery 重复ajax调用的内存使用和泄漏
我有下面的Ajax调用,它将表单数据发送到页面并找到特定的响应Jquery 重复ajax调用的内存使用和泄漏,jquery,ajax,memory-leaks,Jquery,Ajax,Memory Leaks,我有下面的Ajax调用,它将表单数据发送到页面并找到特定的响应 $.ajax({ url: $("form[name='MainForm']").attr('action'), data: $("form[name='MainForm']").serialize()+'&btnupdateprice.x=0&btnupdateprice.y=0', type: 'POST', cache: false, success: function
$.ajax({
url: $("form[name='MainForm']").attr('action'),
data: $("form[name='MainForm']").serialize()+'&btnupdateprice.x=0&btnupdateprice.y=0',
type: 'POST',
cache: false,
success: function(response) {
errors = $(response).find("#listOfErrorsSpan");
result2= $(response).find(".colors_pricebox:eq(0)");
$(".colors_pricebox:eq(0)").replaceWith(
'<table width="100%" cellspacing="0" cellpadding="0" border="0" class="colors_pricebox">' + result2.html() + '</table>');
$('#listOfErrorsSpan').replaceWith(
'<span id="listOfErrorsSpan">' + errors.html() + '</span>');
}
});
$.ajax({
url:$(“form[name='MainForm'])attr('action'),
数据:$(“form[name='MainForm'])。serialize()+'&btnupdateprice.x=0&btnupdateprice.y=0',
键入:“POST”,
cache:false,
成功:功能(响应){
errors=$(response.find(#listOfErrorsSpan”);
结果2=$(响应).find(“.colors\u pricebox:eq(0)”;
$(“.colors\u pricebox:eq(0)”)。替换为(
''+result2.html()+'';
$(“#列表错误span')。替换为(
''+错误。html()+'';
}
});
每次页面通过Ajax调用此页面时,它都会加载大约74k的数据。我没有具体的编程问题,但我想知道是否有一种或多种方法可以限制任何泄漏或。。。。在本例中,我提取了加载页面的两个区域,并将其存储在变量“error”和变量“result2”中
我是否需要执行诸如销毁、分离或以其他方式“删除”响应中未使用的数据之类的操作。它存放在什么地方了吗。每次通过Ajax重新加载都会被覆盖或占用新空间。我是否需要或应该在使用错误和结果2变量后销毁它们,因为它们不再需要?或者,我可能会或者不应该使用变量来存储结果,直接按照如下所示进行操作
对不起,我说的不太有道理。不太熟悉这个。我只是想知道是否有什么我应该关注的泄漏。谢谢你的反馈
$(".colors_pricebox:eq(0)").replaceWith(
'<table width="100%" cellspacing="0" cellpadding="0" border="0" class="colors_pricebox">' + $(response).find(".colors_pricebox:eq(0)") + '</table>');
$('#listOfErrorsSpan').replaceWith(
'<span id="listOfErrorsSpan">' + $(response).find("#listOfErrorsSpan").html() + '</span>');
$(“.colors\u pricebox:eq(0)”)。替换为(
“+$(响应)。查找(“.colors\u pricebox:eq(0)”)+”;
$(“#列表错误span')。替换为(
'+$(响应).find(“#ListofErrorspan”).html()+”;
具体症状是什么,在哪个浏览器上
JavaScript是一种GC语言,不可访问的对象会被适当地删除(回收)(这有点“捕获”,因为执行上下文是绑定在一起的,但是…)。除非有一个特定的问题,不要担心:-)-我可以想出一些人为的例子,涉及到临时数据保存时间太长的执行上下文,但在实践中,我没有遇到这样一个真正重要的案例。讨论执行上下文和范围,这些上下文和范围应涵盖这种潜在形式的“泄漏”
如果遇到这种情况,可以释放引用(例如x=null
)或使用delete
关键字。它们实际上并不会“删除”对象(关键字delete
可以删除属性),但可以(如果不再有任何引用)使其符合回收条件
在上面的代码中,似乎正在使用“全局”变量(error和result2),如果是这样(并且不需要),使用局部变量可能会使更多的对象符合回收条件,因为局部变量将随着执行上下文而消失(从而可能使它们包含的对象符合回收条件)。但是,下次回调运行时,这些值将被覆盖(除非持有另一个引用),这将使以前的对象符合回收条件——也就是说,不存在复合问题。与之相比:
globalArrayThatIsNeverCleared.push(result2)
还有(或者曾经?)一些IE内存泄漏是由于访问JavaScript GC“外部”的对象而导致的,这导致了无法释放的循环图,等等。谢天谢地,我没有任何问题,只是想确认一下(尽可能多)“我没有制造任何潜在的问题,或者我可以在问题变得更大之前删除任何可能存在的问题。@user357034更新了文章,提供了一些详细信息,包括对全局变量问题的具体答复。因此,在这种情况下,您建议使用“var errors”和“var result2”我不使用Ajax函数之外的变量。不使用第二个例子中的变量会更好吗?我甚至没有检查第二个代码的语法是否正确。@user357034 Yes:-)作为一般规则:始终限制变量范围(如果适用)(通常这意味着局部变量超过“全局变量”)。它有助于代码本身传递更多的语义信息,并减少发生奇怪冲突的机会!(在这种情况下,回调后使用的内存可能会减少~74k。)