缓存或不缓存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是一个瓶颈,每一点都有帮助+它始终是使良好实践成为常规的最佳选择!