我创建了一个jQuery插件来修改我的导航。不幸的是,我必须访问和修改几乎所有的子元素,比如<ul>
、<li>
、<a>
等等。然后需要这些元素一到四次。
我应该将它们全部存储在变量中,还是应该在需要时像$('.my-nav').find('li')
或$('.my-nav').find('li')
一样访问它们?
只需25行代码就有5个变量,这似乎是浪费内存。但我不知道为了获得更高的性能,这是不是一个可以接受的折衷方案。
我创建了一个提琴来说明它的含义:http://jsfiddle.net/Yj35Q/2/
发布于 2012-05-07 21:43:48
缓存你的节点总是很好的实践。您还可以使用http://jsperf.com/进行基准测试
除非要存储大量的DOM树或其他东西,否则您不需要担心变量需要多少存储空间。更相关的是JS引擎定位节点所需的工作量。
编辑
或者更好的是,您可以找到其他人已经创建的现有测试用例
发布于 2012-05-07 22:50:29
无论是否使用jQuery,在适当的地方缓存DOM元素无疑都是明智的。
但这个问题让我想,也许我们应该有一个插件来帮助解决这个问题。我到处找都找不到。
所以我很快就写了一个。这是lazy loading jQuery selector..。
(function($){
var cachedObjects = new Array();
$.lazy = function(selector) {
if (typeof selector != "string" || arguments.length > 1)
return $.apply(this, arguments);
var o = cachedObjects[selector];
if (o == undefined)
{
o = $(selector);
cachedObjects[selector] = o;
}
return o;
};
})(jQuery);
你会像这样使用它...
$.lazy('.my-nav').show();
如果我疏忽了什么,请告诉我。但我相信,只要你选择的元素是静态的,而不是动态添加或删除的,这将是很好的选择。
更新
我已经修改了代码以使其更高效。当选择器不是字符串时,我已经在return $(selector)
中添加了一行。因此,只有当选择器是字符串时,缓存才会起作用。
更新#2
现在,根据jFriend00的建议,当你不是简单地传递一个字符串时,它就会return $.apply(this, arguments)
。
发布于 2012-05-07 21:52:40
在同一个函数中,我会将DOM搜索的结果缓存到一个局部变量中,这样就不必在同一个函数中多次执行相同的DOM搜索。对于大多数函数来说,这是不需要的,但是将结果放在一个局部变量中是简单和安全的,所以我认为这是一个好习惯。
我通常不会将DOM节点缓存到全局变量中,因为我尽量避免使用全局变量,而且在特定函数需要时检索DOM节点也很少会造成性能问题。避免在全局变量中使用DOM引用的另一个原因是,如果从DOM中删除了特定的DOM节点,并且您打算对其进行垃圾回收,则如果在全局变量中存在对该节点的引用,则不会对该DOM节点进行垃圾回收,从而可能导致内存泄漏。
在某些情况下,我会重复查找相同的DOM节点(比如在计时器上),将DOM节点缓存到函数闭包中的非全局变量中,然后在本地使用该变量。但是,我发现在某些情况下,这种情况很少见。
https://stackoverflow.com/questions/10489525
复制相似问题