javascript - ASP.NET Ajax Dispose模式等效于jQuery吗?

标签 javascript jquery asp.net-ajax memory-leaks

ASP.NET Ajax通过具有IDisposable接口可以使您释放资源,从而具有处置模式。


如何在jQuery中释放资源?有没有类似的模式?
ASP.NET Ajax库如何/何时调用dispose函数?
如果一段时间后页面将重新加载,我们是否需要担心内存泄漏?

最佳答案

如何在jQuery中释放资源?有没有类似的模式?


jQuery将使用bind()处理附加到DOM元素的分离事件处理程序。因此,与开发人员负责分离事件处理程序本身的情况相比,对DOM元素的悬挂引用应该少得多。但是,仅在页面卸载时(即unload对象的window事件)才执行此操作。那时,它会迭代其事件缓存(jQuery.cache)并从元素中删除事件侦听器,以便浏览器可以推断出不再引用这些元素并回收它们使用的内存。

jQuery中没有说服的IDisposable模式。对于您自己的对象,必须自己处理。 $(window).bind('unload', myCleanupFunction)是一个很好的开始。只需在对象上实现dispose方法并从此清理函数中调用它,就没有错。

概括地说,应特别注意并销毁可以/可能具有循环引用的任何对象属性或全局变量(delete or null就足够了)。对DOM元素的任何引用都应删除或为空。围绕DOM元素闭合的对closures的任何引用都应删除或为空(事件处理程序是此模式的常见来源)。如果从DOM中删除元素,请使用remove()删除,这将自动从元素中清除jQuery绑定的事件处理程序。


  ASP.NET Ajax库如何/何时调用dispose函数?


与jQuery一样,ASP.NET AJAX框架也挂接到unload对象的window事件中以执行一些引用清除。卸载页面后,将调用Sys.Application.disposethe following occurs


如果您在应用程序中创建了pageUnload()函数,则该函数称为
它在您已向应用程序注册的任何对象上调用dispose()
它引发Application unload事件。
它处理ScriptLoader实例。


默认情况下,创建ASP.NET AJAX组件,控件和行为时,它们会自动在Sys.Application对象中注册(在Sys.Component构造函数中)。从IDisposable继承的任何内容在实例化后都会自动registered with the framework(并放置在Sys.Application._disposableObjects中)。

对于实现IDisposable的对象,将调用您实例的dispose()方法(就像在服务器上一样)。但是,您仍然要负责释放引用(就像在服务器上一样)。

IOW,您仍然需要注意delete方法中对象的nulldispose属性。与jQuery相同的规则在这里适用:任何可能/可能具有循环引用的对象属性或全局变量都应给予特别注意,对DOM元素的引用应删除或为空,对围绕DOM元素关闭的闭包的引用应删除或为空。 。

但是,与jQuery不同,ASP.NET AJAX不会在页面卸载1时自动删除与Sys.UI.DomEvent.addHandler(也称为$addHandler)绑定的侦听器。您必须小心自己执行此操作。框架确实提供了Sys.UI.DomEvent.clearHandlers(element)(又名$clearHandlers)来轻松实现此目的。您可以在dispose()实现中调用它,并将在框架中附加了事件侦听器的所有元素都传入。

客户端中的IDisposable不仅是放置“卸载”代码的方便位置,而且是代码自行进行自我文档编制的一种方式。我怀疑大多数人不会在其应用程序的生存期内创建和处置许多对象,而是在页面加载一次创建它们,并在页面卸载一次销毁它们。


  如果一段时间后页面将重新加载,我们是否需要担心内存泄漏?


在不经常卸载的DOM树中对内存进行性能分析已付出了很多努力。通常,如果页面经常卸载,您不必太担心(这包括导航到应用程序中其他页面的用户)。如果是长期应用程序(例如
gmail),您必须格外小心以免发生内存泄漏。对于寿命长的应用程序,不应将内存容纳视为过早的优化,而应将其视为非常明显的可能性。当然,这不会成为性能瓶颈(与I / O相比),但是在当今的应用程序中,DOM实在是太让人讨厌了,无法让浏览器来处理它。但是,对此的管理非常棘手。



1此功能以autoRemove参数的形式传入4.0版

关于javascript - ASP.NET Ajax Dispose模式等效于jQuery吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1713094/

相关文章:

javascript - 优化 javascript if else 18 次

javascript - 使用 html 表显示 MySql 数据

javascript - 了解 not 运算符在 :selected 中的用法

JavaScript 全局变量声明

javascript - AJAX 回调在 Firefox 中失败

javascript - 显示我的 json 结果,但它只从数据库返回 1 个结果

jquery - 在textarea中制作多色动态文本

javascript - jQuery .click() 在 Safari 中不起作用

javascript - 如何在动态加载的用户控件上创建和调用 JavaScript 函数?

jquery - jQuery ajax 添加数据时,<tr> 点击事件不起作用