2012-09-18 48 views
0

我已经做了一些研究(JavaScript closure and memory issues),但没有完全理解JS关闭以及它们如何影响内存泄漏。我正在进行更多的研究,因为我问这个问题试图更好地理解它,但是我想我会看看是否有人能够看到这个问题,并在我这样做时诊断问题。JQuery关闭内存泄漏

我在我的网站上使用jQuery来更新表中的数据。它在使用时缓慢地在内存中蔓延,但最大的问题是当用户刷新页面时,它跳跃了〜3MB。在浏览器中打开其他标签时会出现类似问题,以至于在使用几个小时后可能会使用200MB的内存。通过我的阅读,我认为我已经将问题缩小到了代码中的关闭问题。这是做大部分工作的主要部分。

$(document).ready(function(){ 
setDateSelect(); 
var url_fm_smry=url_fm_smry_base + url_fm_currdate2 + url_region; 
$.getJSON(url_fm_smry,function(data) 
{ 
    $('#summaryContainer').empty(); 
    $('#summaryTblTmpl')     // Select the template. 
    .tmpl(data.d.results)    // Bind it to the data. 
    .appendTo('#summaryContainer');  // Render the output. 
}); 

$.getJSON(url_fm_meta + url_region,function(data) 
{ 
    $('#runDTM').empty(); 
    $('#runDTMTmpl')      // Select the template. 
    .tmpl(data.d.results)    // Bind it to the data. 
    .appendTo('#runDTM');    // Render the output. 
}); 

setInterval(summaryCall,5000);}); 

setDateSelect加载基于今天的日期变量日期的下拉菜单。

url_fm_smry是由其他功能需要访问的3个全局变量组成的局部变量。

summaryCall只是做了上面的确切的事情,每5秒重复更新一个新的数据流表。

感谢您的任何建议和帮助。

+0

我不认为这是一个封闭的问题。在您发布的代码中,我无法检测到关闭。 –

+0

不相关,但您应该避免在此处使用setInterval b/c,它可能会在首次调用完成之前再次调用summaryCall。相反,尝试使用summaryCall完成后调用setTimeout。 – tkane2000

+0

什么是'.tmpl()'?请链接到插件文档。它可能需要一些'destroy'调用来忘记以前附加的数据吗? – Bergi

回答

0

内部,getJSON做到这一点:

getJSON: function(url, data, callback) { 
    return jQuery.get(url, data, callback, "json"); 
} 

在该行设置断点和查看功能范围。至少有:

  1. jQuery的
  2. jQuery.getJSON回调
  3. jQuery.get内部调用
  4. jQuery.get内部回调

呼叫jQuery.get直接与命名的功能,而不是避免关闭范围的匿名函数。

参考

+1

猜猜jQuery.get'在内部做了些什么?无论如何,这个评论如何回答这个问题? – Bergi