首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将选中/找到的元素存储在变量中是否会提高性能?

将选中/找到的元素存储在变量中是否会提高性能?
EN

Stack Overflow用户
提问于 2012-05-07 21:38:10
回答 3查看 2.2K关注 0票数 7

我创建了一个jQuery插件来修改我的导航。不幸的是,我必须访问和修改几乎所有的子元素,比如<ul><li><a>等等。然后需要这些元素一到四次。

我应该将它们全部存储在变量中,还是应该在需要时像$('.my-nav').find('li')$('.my-nav').find('li')一样访问它们?

只需25行代码就有5个变量,这似乎是浪费内存。但我不知道为了获得更高的性能,这是不是一个可以接受的折衷方案。

我创建了一个提琴来说明它的含义:http://jsfiddle.net/Yj35Q/2/

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-07 21:43:48

缓存你的节点总是很好的实践。您还可以使用http://jsperf.com/进行基准测试

除非要存储大量的DOM树或其他东西,否则您不需要担心变量需要多少存储空间。更相关的是JS引擎定位节点所需的工作量。

编辑

或者更好的是,您可以找到其他人已经创建的现有测试用例

http://jsperf.com/ns-jq-cached/4

票数 8
EN

Stack Overflow用户

发布于 2012-05-07 22:50:29

无论是否使用jQuery,在适当的地方缓存DOM元素无疑都是明智的。

但这个问题让我想,也许我们应该有一个插件来帮助解决这个问题。我到处找都找不到。

所以我很快就写了一个。这是lazy loading jQuery selector..。

代码语言:javascript
运行
AI代码解释
复制
(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);

你会像这样使用它...

代码语言:javascript
运行
AI代码解释
复制
$.lazy('.my-nav').show();

如果我疏忽了什么,请告诉我。但我相信,只要你选择的元素是静态的,而不是动态添加或删除的,这将是很好的选择。

更新

我已经修改了代码以使其更高效。当选择器不是字符串时,我已经在return $(selector)中添加了一行。因此,只有当选择器是字符串时,缓存才会起作用。

更新#2

现在,根据jFriend00的建议,当你不是简单地传递一个字符串时,它就会return $.apply(this, arguments)

票数 4
EN

Stack Overflow用户

发布于 2012-05-07 21:52:40

在同一个函数中,我会将DOM搜索的结果缓存到一个局部变量中,这样就不必在同一个函数中多次执行相同的DOM搜索。对于大多数函数来说,这是不需要的,但是将结果放在一个局部变量中是简单和安全的,所以我认为这是一个好习惯。

我通常不会将DOM节点缓存到全局变量中,因为我尽量避免使用全局变量,而且在特定函数需要时检索DOM节点也很少会造成性能问题。避免在全局变量中使用DOM引用的另一个原因是,如果从DOM中删除了特定的DOM节点,并且您打算对其进行垃圾回收,则如果在全局变量中存在对该节点的引用,则不会对该DOM节点进行垃圾回收,从而可能导致内存泄漏。

在某些情况下,我会重复查找相同的DOM节点(比如在计时器上),将DOM节点缓存到函数闭包中的非全局变量中,然后在本地使用该变量。但是,我发现在某些情况下,这种情况很少见。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10489525

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文