一个只有Ajax的网站会随着时间的推移吃掉内存吗

时间:2016-10-07 22:20:16

标签: javascript jquery ajax

我正在创建一个仅限ajax的网站,所以我可以使用精美的页面转换和其他可爱的东西。对于所有元素,我有一个像这样的JavaScript / jQuery:

var slider = {
   init: function(){
      if($(".slider").length > 0){
         //do slider stuff
      }
   }
}

在每个页面加载时,我都会初始化所有内容,当该元素位于当前页面时,它会做到这一点。

pageloaded = function(){
   slider.init();
   tabs.init();
   comments.init();
   reviews.init();
   //...
}

但我的问题是。删除旧页面时,它的按钮和其他元素附加了各种javascript。当该页面是.removed()时,它自动消耗的内存和其他资源是否会被“释放”?

这种编程方式还有其他缺点吗?

2 个答案:

答案 0 :(得分:0)

这与性能和内存有关。

这取决于你正在做什么以及你是如何做的。

如果你用AJAX请求替换整页加载(即当用户点击链接按钮时只进行AJAX调用并且会有整页加载),那么AJAX将减少服务器负载,因为你(大概)减少处理并返回较少的数据。

如果您要添加自动更新类型AJAX并且每隔几秒钟轮询一次服务器,那么根据使用情况可能会增加负载。

假设您正在执行良好的实施,您可以获得良好的结果。

编辑(第二条评论):

为什么我说如果依靠良好的实施,你会有很好的结果。

通常,浏览器会保留对XHR(也称为垃圾收集根)的不可访问的内部引用。

这不仅使XHR在请求期间保持活动,而且还保持它引用的闭包。

响应进来后,它也会保持响应数据的存活。浏览器将决定何时释放这些对象。虽然旧版本的IE接口使这些参考文件的使用时间远远超过必要的时间,但现代版本的bwosers具有更好的性能和功能。

这是一个非常复杂的问题,用几句话来解释。

所以重新上限:

假设您正在执行良好的实施,您可以获得良好的效果。

答案 1 :(得分:0)

从理论上讲,答案是如果一切都做得好的话就不会。 :)

当我说完成时我的意思是在两个地方,首先有时在实际浏览器中存在可能导致内存泄漏的错误。微软曾经在某一时刻引用了计数垃圾收集器,这是浏览器供应商犯了错误的典型例子。我认为所有浏览器现在都使用标记和清除垃圾收集器。

另一个地方是你可以获得内存泄漏,显然是javascript,无论是你,还是第三方图书馆。

仅仅因为Javascript使用垃圾收集器,仍然并不意味着你无法获得内存泄漏,正如一些人可能会建议的那样。它仍然是可能的,javascript最常见的错误就是说事件委托& SetInterval,但您可以轻松地在全局窗口对象等上构建一些数据。

要考虑的主要事项是,如果我的对象不再被引用,那么是的,垃圾收集器将自动释放所述对象的所有内存。

Chrome有一些非常漂亮的调试工具来检查这样的事情。因此,如果您担心内存泄漏,请查看。