我有一个关于处理对jQuery对象的引用的问题。
假设在我的应用程序中我有一个ID = some_widget的DOM元素DIV,它应该在所有应用程序运行时期间存在并且在代码中经常使用。
1)因此,如果我在应用程序运行时期间在全局变量中保留对它的引用:
var someWidget = $("#some_widget")
它会创建一次jquery对象,但会在应用程序运行期间消耗内存,但是当我使用someWidget时它不会再次创建jquery对象,所以这可以加快这个过程。
2)如果我总是在代码中使用$(“#some_widget”)的调用,它将不会不断消耗内存,但每次我都使用$。构建对象需要时间jQuery。
我是对的吗?什么方法更充足? 保持对许多对象的引用最终会导致内存泄漏吗? 它取决于什么,你怎么看?
答案 0 :(得分:2)
是的,您可以通过在变量中声明它来缓存您的jQuery对象。事实上,这被认为是重复使用对象的最佳实践。
答案 1 :(得分:2)
我的理解(虽然我自己仍然是jQuery新手)是通过缓存jQuery对象来节省来自每次调用选择器时都不遍历DOM的事实。因此,例如,如果在代码中多次调用$("#some_widget")
,jQuery将每次遍历DOM以查找具有该ID的元素。如果在变量中缓存一次,则可以像调用选择器一样调用jQuery方法,但不需要DOM遍历。我已在我的代码中完成了这项工作,并实现了性能改进我不知道使用缓存方法有任何内存泄漏问题,我对该主题的大部分阅读建议将缓存作为最佳实践。
除此之外,如果您执行此操作可能会有所帮助,即添加命名约定来缓存此类型的变量。例如,在变量前加上$:
var $someWidget = $("#some_widget");
有些人不喜欢这样,但我发现它在视觉上跟踪哪些变量可以使用jQuery函数时很有用。
答案 2 :(得分:1)
是的,你是对的。我唯一想补充的是
var query_result = $("some_selector")
实际上是将查询结果缓存到变量中以供以后使用。如果查询的结果恰好是一个小部件,那么正在缓存它。显而易见的优点是,当您使用此缓存查询时,jQuery将不必再次查询DOM以为您构建结果。但缺点是缓存的结果就像执行查询时的DOM快照。因此,如果在稍后阶段操作了dom,执行$("previous_selector")
将返回与缓存query_result
不同的内容,这可能不是您所期望的。
不完全确定内存泄漏,已经看到很多程序员都使用这种缓存技术,也是推荐的。