【发布时间】:2011-04-08 14:30:26
【问题描述】:
大家!我正在开发某种活动日历,我使用 jQuery 作为前端,使用 PHP 作为后端。我有所有用 PHP 创建的日历数据,并以 JSON 编码发送到客户端。
考虑以下代码(简化):
jQuery(document).ready(function($) {
// property which contains calendar object
this.Calendar;
// get calendar object
show_month();
/* Assign a click event to the next month button */
$('#cal_month .next span').live('click', function() {
var month = $(this).attr('id');
var year = $(this).attr('class');
show_month(month, year);
});
function show_month(month, year) {
// delete pointers to the current month object
window.Calendar = undefined;
// get new month object
window.Calendar = get_month(month, year);
/* doing some stuff with this object here, like output to the
document etc., no event bindings */
}
function get_month(month, year) {
var calendar;
$.ajax({
type: 'GET',
dataType: 'json',
async: false,
timeout: 100,
url: '../some_url.php?month='+month+'&year='+year,
success: function(result) { calendar = result; }
});
return calendar;
}
var counter = 0;
while (counter != 1000) {
$('#cal_month .next span').trigger('click');
counter ++;
}
});
手动切换月份以及循环会导致大量内存泄漏。我在这里以及通常在互联网上阅读了很多关于内存泄漏、js 闭包等的信息,但我想我仍然有一些误解。我很高兴了解我的代码有什么问题。
更新
我正在查看任务管理器中的 firefox.exe(其他浏览器也有同样的问题)来测量内存使用情况。即使我从页面导航,内存也不会释放。一段时间后,它会导致性能大幅下降,因为我可以让它使用 600+ Mb。
我还编写了一个循环来切换月份(在上面添加了代码)。
更新 2
我使用 global 的原因是在我的事件日历中我也有周和日视图,所以我希望一个活动的月份对象可用于处理这两个视图的函数,并且只销毁它并获取新的用户切换月份时的一个。我的问题正是全局变量的使用。那个解决了,现在试图弄清楚如何在用户明确切换月份之前保持对象可用......
顺便说一句,我创建了一个 while 循环仅用于基准测试,它与我的实际代码无关。
【问题讨论】:
-
为什么
Calendar是全局的?只需将其声明为var Calendar;并将其在其他地方引用为Calendar而不是window.Calendar。也无需在将Calendar = undefined;分配给新值之前立即分配它。 -
我没有看到任何内存泄漏,但我可能是错的。一个示例页面(或更多代码)会很有帮助,因此我们可以对其进行测试。
-
你究竟是如何测量内存使用的?
-
@MattBall 这是合乎逻辑的,这就是我首先写的,但效果相同,那时我开始思考指向对象的指针、垃圾收集器和其他东西,以及想出了可能更错误的决定。
-
我想知道当您在几个月中循环时,事件处理程序是否没有被破坏。我发现了这个 - stackoverflow.com/questions/2316726/javascript-memory-leaks ,这可能会有所帮助。
标签: javascript jquery json memory-leaks closures