总是使用jquery选择器或将它们缓存在变量中?

时间:2008-11-30 18:21:01

标签: javascript jquery performance

jQuery选择器非常精彩,但有时候我会发现自己一遍又一遍地输入它们,这有点烦人。

 $('#mybutton').click(function() {
    $('#message-box').doSomething();
    $('#message-box').doSomethingElse();
    $('#message-box').attr('something', 'something');
 });

所以我经常喜欢将我的对象缓存在变量中:

$('#mybutton').click(function() {
    var msg = $('#message-box');
    msg.doSomething();
    msg.doSomethingElse();
    // you get the idea 
});

这两种模式之间是否存在任何利弊?有时感觉创建变量是额外的工作,但有时它会节省我的手指很多打字。是否有任何记忆问题需要注意?选择器在使用后是否可以很好地清理,而我糟糕的编码习惯往往会使存储器中的变量更长?

这不会让我夜不能寐,但我很好奇。感谢。

编辑:请参阅this question。它基本上要求相同的东西,但我更喜欢答案。

5 个答案:

答案 0 :(得分:15)

你应该链接它们:

$('#mybutton').click(function() {
  $('#message-box').doSomething().doSomethingElse().attr('something', 'something');
 });

如果你需要反复做一些事情并且函数没有返回jQuery对象,那么在var中保存它们会更快。

答案 1 :(得分:3)

我通常按照Pims的答案将它们链接起来,但有时当有很多操作要立即完成时,链接会导致可读性问题。在这些情况下,我将选定的jQuery对象缓存在变量中。

答案 2 :(得分:2)

我说去吧!

我和你做同样的事情。

它使我的代码更具可读性,这让我感到高兴。

答案 3 :(得分:0)

实际上这个问题要复杂得多。

  1. 链接并不总是可行的,因为选择器字符串或缓存的jQuery选择器实例可能存储在新的function()属性中,由各种原型函数访问,而不是单一代码。

  2. 您可以链接选择器字符串和缓存的jQuery选择器。我想使用选择器字符串作为'this'属性应该带来更慢但更少RAM消耗的代码,而使用缓存选择器应该带来更快但更多RAM消耗的代码。我是对的吗?

  3. 我准备将很多新的function()属性从选择器字符串更改为缓存选择器,这就是我要问的原因。

答案 4 :(得分:0)

Pim Jager对于这种特定情况是100%正确的,但是指出在某些情况下缓存更合适可能是有用的。

首先,每次调用$('something')时,都要重新实例化整个jQuery对象,因此无论何时要对jQuery对象执行多个操作,都会调用链接或缓存。

如果您要在闭包中执行所有操作,请对该对象执行操作,链接是您的朋友并且Pim Jager的代码是正确的。但是,如果您要评估该对象的某些部分,那么您将无法将这些操作和缓存链接起来,正如原始海报的第二个代码块所示,实际上是要走的路。例如:

$('#mybutton').click(function() {
    var msg = $('#message-box');
    msg.doSomething();
    if (msg.hasClass('.something')) {
        msg.dosomethingElse();
    }
});

有趣的资源:http://jsperf.com/jquery-chaining-vs-caching