ASP.NET Ajax在jQuery中处理模式的等价物?

时间:2009-11-11 04:52:22

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

ASP.NET Ajax,具有一个IDisposable接口,可让您释放资源,从而具有一种处置模式。

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

1 个答案:

答案 0 :(得分:14)

  

如何在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.dispose时,系统会调用 the following occurs

  1. 如果您在应用程序中创建了pageUnload()函数,则称该函数为
  2. 在您已向应用程序注册的任何对象上调用dispose()
  3. 它引发了应用unload事件。
  4. 它处理ScriptLoader实例。
  5. 在创建组件时(在Sys.Application构造函数中),ASP.NET AJAX组件,控件和行为默认自动注册到Sys.Component对象。任何继承自IDisposable的内容在实例化时会自动 registered with the framework (并放在Sys.Application._disposableObjects中)。

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

    仍然需要在delete方法中关注对象的nulldispose属性。与jQuery相同的规则适用于此:应该特别注意任何可以/可能具有循环引用的对象属性或全局变量,应该删除或取消对DOM元素的引用,应该删除或禁用对封闭在DOM元素周围的闭包的引用

    与jQuery不同,当页面卸载 1 时,ASP.NET AJAX不会自动删除与Sys.UI.DomEvent.addHandler(aka $addHandler)绑定的侦听器。你必须自己照顾这个。该框架确实提供了 Sys.UI.DomEvent.clearHandlers(element) (又名$clearHandlers)来轻松完成此操作。您可以在dispose()实现中调用它,并将附加了事件侦听器的任何元素传递给框架。

    客户端中的

    IDisposable更像是放置“卸载”代码的便利位置,也是代码自行记录的一种方式。我怀疑大多数人在应用程序的生命周期内没有创建和处理许多对象,而是在页面加载时创建它们一次,并在 un 加载页面上销毁它们一次。

      

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

    在不经常卸载的DOM树中分析内存已经付出了很多努力。一般情况下,如果页面经常卸载(包括导航到应用程序中其他页面的用户),则不必过于担心。如果它是一个长期存在的应用程序(例如 gmail),你必须非常小心地记忆泄漏。对于长期存在的应用程序,内存遏制不应被视为过早优化,而是非常明显的可能性。虽然它不会成为性能瓶颈(与I / O说的相反),但在今天的应用程序中,DOM让浏览器只是处理它是一种太多的野兽。然而,管理这个是非常棘手的。


    1 此功能将以autoRemove参数的形式发布到版本4.0 {/ 1}}