为什么要缓存jQuery对象?

Why cache jQuery objects?

提问人:ThePixelPony 提问时间:5/20/2014 最后编辑:ThePixelPony 更新时间:5/20/2014 访问量:6815

问:

那么,为什么我们应该缓存jQuery对象呢?

在以下场景中:

var foo = $('#bar');
foo.attr('style','cool');
foo.attr('width','123');

$('#bar').attr('style','cool'); $('#bar').attr('width','123');

为什么第一种选择比第二种选择好得多?

如果是因为性能,它如何减少使用?

JavaScript jQuery 性能 缓存

评论

1赞 King King 5/20/2014
我认为如果您多次使用第一个会更好,在您的示例中,它只使用了 1 次。所以它在这里应该没有任何优势。$('#bar')
0赞 ThePixelPony 5/20/2014
@KingKing,哎呀,我编辑了它以包含两个动作。
1赞 Jason Sperske 5/20/2014
从@mplungjan Google 搜索结果中找到的文章,这里是相关的 JSPerf 测试: jsperf.com/ns-jq-cached/3
0赞 ThePixelPony 5/20/2014
嗯,谷歌真的帮了忙!
1赞 Me.Name 5/20/2014
如前所述,缓存返回的查询结果可以防止多次查找(尽管在查找的情况下,这是一个非常有效的 getElementbyID),但纯粹是为了提到它:JQuery 通过让其函数重新返回对象来提供帮助,因此 attr 返回与使用相同的对象,从而实现以下可能: .具有重用查询对象的相同优点。#$('#bar').attr('style','cool').attr('width','100');

答:

0赞 ThePixelPony 5/20/2014 #1

jQuery 选择器在整个 DOM 中搜索匹配的元素,然后返回结果。$('#foo')

缓存这些结果意味着 jQuery 不必在每次使用选择器时都搜索 DOM。

EDIT:是jQuery用来搜索DOM的,但jQuery永远不够用。document.getElementById()

评论

2赞 Jason Sperske 5/20/2014
你的答案是正确的,但在ID选择器的特定实例中,jQuery只是使用document.getElementById()
19赞 David 5/20/2014 #2

因为 jQuery 函数中有很多代码,如果使用相同的输入多次执行它,则会产生不必要的开销,从而产生相同的输出。通过缓存结果,您可以存储对要查找的确切元素或元素集的引用,这样您就不必再次搜索整个 DOM(即使搜索速度相当快)。在许多情况下(代码量很少的简单页面),您不会注意到差异,但在您这样做的情况下,可能会有很大的差异。

您可以通过在 jsPerf 中测试您的示例来了解这一点。

出于可读性目的,您还可以将其视为 Introduce Explain Variable 重构模式的一个示例,尤其是比问题中的示例更复杂的示例。