缓存或不缓存jQuery中的$(this)

当选择器为$(this)时,创建和重用引用是否会显着提高性能?

当我在同一范围内多次使用相同的选择器时,我为我的jQuery选择器创建了引用。 以下更有效

  var jSel = $('div.some_class input.some_other_class'); some_function1(jSel); some_function2(jSel); 

比这个

  some_function1($('div.some_class input.some_other_class')); some_function2($('div.some_class input.some_other_class')); 

但是如果选择器只是$(this) ,那么this是jQuery方法中的dom元素。 我是否需要创建对$(this)的引用并重用该引用,或者我可以创建多个$(this)选择器并期望类似的性能?

是以下

  var jSel = $(this); some_function1(jSel); some_function2(jSel); 

明显快于以下?

  some_function1($(this)); some_function2($(this)); 

以下是否明显快于以下?

。 它在显微镜下更快; 在几微秒的范围内。

这会阻止您将结果分配给变量并使用它吗? 。 使用变量可以赋予它更多的含义,并且可以更容易键入。 另外,如果你停止想要操作$(this) ,而是想要$(this).next() ,你必须在一个地方而不是n改变它。

您会发现jQuery构造函数已经过高度优化,可以将单个DOM元素作为参数接受。 以下是调用$(DOMElement)时执行的确切代码 $(DOMElement)当然, 在创建jQuery对象之后 ):

 var match, elem, ret, doc; // Handle $(""), $(null), or $(undefined) if ( !selector ) { return this; } // Handle $(DOMElement) if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; } // Handle lots of other param types, but we hit the above one, so we've stopped now... 

这完全取决于你拨打了多少电话。 将变量设置为有效的变量肯定比保持相同的工作更快,但样本中的差异可以忽略不计。 如果你在一个500万的循环中这样做,差异将不那么微不足道,设置变量将更快,因为它只做一次而不是500万次。

在这种特殊情况下,如果您真的在编写希望将jQuery对象作为参数的函数(如示例中所示),那么您可以将这些函数重写为jQuery方法。 然后你可以写:

 $(this).some_function1().some_function2(); 

编写jQuery方法非常简单,至少是简单方法。 一般(再次,简单)forms是:

 jQuery.fn.some_function = function() { return this.each(function() { // stuff you want to do }); }; 

this是对象的引用。 使用$(this)需要一些时间(因为jQuery将其转换为数组)但这次与IMHO无关。 所以第一种方法应该快一点,但实际上你不会注意到差异。

http://jsperf.com/jquery-cache-vs-no-chace

应该给你一个速度差异的基本概念。 在大多数简单的情况下,它可能不会显着影响您的代码执行速度,但JS是一个瓶颈,每一点都有帮助+它始终是使良好实践成为常规的最佳选择!