内存使用和重复的ajax调用泄漏

时间:2010-10-30 22:56:57

标签: 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(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调用此页面时,它都会加载大约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>');

1 个答案:

答案 0 :(得分:2)

究竟是什么症状和浏览器?

JavaScript是一种GC语言,不可访问的对象会被删除(回收)(当执行上下文被绑定时,这稍微“捕获”但是......)。除非有特定的问题,不要担心:-) - 我可以想到一些人为的例子涉及执行上下文与临时数据持续太长时间,但实际上我没有碰到这样的情况,其实很重要。 Jibbering Notes: JavaScript Closures讨论应该涵盖这种潜在形式的“泄漏”的执行上下文和范围。

如果你遇到这种情况,你可以发布引用(例如x = null)或使用delete关键字。这些实际上并不“删除”对象(delete关键字可以删除属性),但可以(如果不再有任何引用)使其有资格进行回收。

在上面的代码中,看起来正在使用“全局”变量(error和result2),如果是这样(并且不需要它们),使用局部变量可能会使更多对象有资格进行回收,因为局部变量将会消失使用执行上下文(从而可能使它们包含的对象有资格进行回收)。但是,下次回调运行时,将覆盖这些值(除非保留另一个引用)将使前一个对象有资格进行回收 - 也就是说,没有复合问题。与之相比:

globalArrayThatIsNeverCleared.push(result2)

由于访问JavaScript GC“之外”的对象导致无法释放的循环图等,也会导致某些IE内存泄漏。