Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.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
Jquery 重复ajax调用的内存使用和泄漏_Jquery_Ajax_Memory Leaks - Fatal编程技术网

Jquery 重复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调用,它将表单数据发送到页面并找到特定的响应

$.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。)