2009-09-17 50 views
2

我发现自己做了很多这样的jQuery的:

$('.filter-topic-id').each(function() { 
    var me = $(this); 
    if (me.text() == topics[k]) { 
     me.parent().show(); 
    } 
}); 

我存储$(this)在一个名为me变量,因为我害怕它会重新评估$(this)没原因。主要的JavaScript引擎是否足够聪明,知道它不必重新评估它?也许甚至JQuery足够聪明?

回答

3

他们不够聪明,不知道如果这就是你的代码所说的再次重估$(this)。在变量中缓存jQuery对象是最佳做法。

如果你的问题是指你的方式的问题相比,这种方式

$('.filter-topic-id').each(function() { 
    if ($(this).text() == topics[k]) { // jQuery object created passing in this 
     $(this).parent().show(); // another jQuery object created passing in this 
    } 
}); 

你的方式是最好的做法。

0

这个只是在迭代中对当前DOM元素的引用,因此调用$(this)时很少或根本没有任何开销。它只是在DOM元素周围创建一个jQuery包装器。

+2

......这本身有一些开销。 – 2009-09-17 08:55:42

1

你可以尝试用Firebug来分析你的代码,看看是否使用$(本)多次减慢你的应用程序或不

1

有没有什么好办法,一个JavaScript可以判断出以下情况: -

fn(x) == fn(x); 

即使这可能不是拨打第二fn只能是有效的,如果它可以被guaraneed是fn尚未有其他副作用。在拨打fn之间存在其他代码时,则更加困难。

因此,Javascript引擎别无选择,只能在每次调用时调用fn

调用$()的开销很小,但不是微不足道的。我当然会把结果保存在一个局部变量中,就像你正在做的那样。

0

我想你会发现通过传递一个dom元素来调用jQuery函数可能是构建该对象的方法中密度最小的。它不必做任何查找或查询DOM,只需将其包装并返回即可。

也就是说,使用你在那里使用的方法绝对不会伤害,这就是我自己一直在做的事情。它有一定的帮助,当你创建嵌套封闭的:

$('div').click(function() { 
    var $this = $(this); 
    $this.find("p").each(function() { 
     // here, there's no reference to the div other than by using $this 
     alert(this.nodeName); // "p" 
    }); 
}); 
2

是主要的JavaScript引擎足够聪明,知道它没有重新评估呢?

不,但如果您使用的是jQuery,您大概是为了提高可读性而不是最大限度地提高性能。

写出你觉得最容易阅读和维护的版本,不要担心这样的微观优化,直到你的页面太慢,你已经耗尽了其他更重要的延迟来源。致电$(node)的工作并不多。