我正在创建一个仅限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()时,它自动消耗的内存和其他资源是否会被“释放”?
这种编程方式还有其他缺点吗?
答案 0 :(得分:0)
这与性能和内存有关。
这取决于你正在做什么以及你是如何做的。
如果你用AJAX请求替换整页加载(即当用户点击链接按钮时只进行AJAX调用并且会有整页加载),那么AJAX将减少服务器负载,因为你(大概)减少处理并返回较少的数据。
如果您要添加自动更新类型AJAX并且每隔几秒钟轮询一次服务器,那么根据使用情况可能会增加负载。
假设您正在执行良好的实施,您可以获得良好的结果。
编辑(第二条评论):
为什么我说如果依靠良好的实施,你会有很好的结果。
通常,浏览器会保留对XHR(也称为垃圾收集根)的不可访问的内部引用。
这不仅使XHR在请求期间保持活动,而且还保持它引用的闭包。
响应进来后,它也会保持响应数据的存活。浏览器将决定何时释放这些对象。虽然旧版本的IE接口使这些参考文件的使用时间远远超过必要的时间,但现代版本的bwosers具有更好的性能和功能。
这是一个非常复杂的问题,用几句话来解释。
所以重新上限:
假设您正在执行良好的实施,您可以获得良好的效果。
答案 1 :(得分:0)
从理论上讲,答案是如果一切都做得好的话就不会。 :)
当我说完成时我的意思是在两个地方,首先有时在实际浏览器中存在可能导致内存泄漏的错误。微软曾经在某一时刻引用了计数垃圾收集器,这是浏览器供应商犯了错误的典型例子。我认为所有浏览器现在都使用标记和清除垃圾收集器。
另一个地方是你可以获得内存泄漏,显然是javascript,无论是你,还是第三方图书馆。
仅仅因为Javascript使用垃圾收集器,仍然并不意味着你无法获得内存泄漏,正如一些人可能会建议的那样。它仍然是可能的,javascript最常见的错误就是说事件委托& SetInterval,但您可以轻松地在全局窗口对象等上构建一些数据。
要考虑的主要事项是,如果我的对象不再被引用,那么是的,垃圾收集器将自动释放所述对象的所有内存。
Chrome有一些非常漂亮的调试工具来检查这样的事情。因此,如果您担心内存泄漏,请查看。