我很好奇,在同一个函数中,当$(this)
被多次调用时,在后续调用中构造 jQuery 对象是否会产生额外的开销?换句话说,$(this)
第一次调用时是否缓存?如果不是,那么将其存储$(this)
在一个变量中并在$(this)
随后需要时使用该变量会是一种更好的做法吗?
5 回答
$()
是 jQuery 构造函数。
this
是对调用的 DOM 元素的引用。
所以基本上, in $(this)
,您只是将this
in$()
作为参数传递,以便您可以调用 jQuery 方法和函数。
http://www.learningjquery.com/2007/08/what-is-this
好数字:http: //jsperf.com/jquery-this-vs-this-vs-chain/2
您通常使用var $this = $(this);
来避免不必要地创建新的 jQuery 对象。对于下面的代码,您只创建一个对象而不是两个/四个。它与可链接性完全无关。
this
在 javascript 中(通常)表示对调用当前函数的对象的引用。
通常存储$(this)
在局部变量中的目的是防止您多次调用 jQuery 函数$()
,如果您必须多次使用它,缓存jQueryized应该有助于提高效率。 this
$
只是一个有效的变量名字符,并用作变量名的第一个字符,通常是为了让程序员排队,它已经是一个 jQuery 对象(并且有相关的方法/属性可用)。
我经常看到这种构造:
var someFunc = function () {
var that = $(this);
// you could also cache like var $this = $(this);
// do stuff here...
};
每次打电话$()
都会有一些开销,但不会太多。如果您不缓存,我认为这不会引起注意$(this)
。请参阅$(this) 的 jquery 缓存上的 SO 条目
每次$(this)
计算表达式时,都会调用 jQuery 工厂函数,从而生成一个新的jQuery 实例。但是,此过程的性能损失可以忽略不计。我曾经计算过它只需要几微秒(百万分之一秒)。
我个人并不担心$(this)
在函数体内有多次。缓存 jQuery 实例 ( var $this = $(this);
) 是一种选择,但我不这样做。(我碰巧觉得这个$this
名字很难看,与 相比$( this )
,我知道大多数人不同意我的观点。)
我做了一个快速测试,看看使用 $ 构造 jQuery 对象是否会增加开销:
var start = (new Date).getTime();
for(var i=0; i<1000000; i++)
{
var testClass = $("#testDiv").attr("class");
}
var end = (new Date).getTime();
alert(end-start);
我在这里所做的只是运行代码 1,000,000 次,以查看将页面上的 jQuery 对象的类存储到变量需要多长时间。它花了大约 4.286 秒。然后我修改它以引用一个已经存储的对象:
var start = (new Date).getTime();
var testDiv = $("#testDiv");
for(var i=0; i<1000000; i++)
{
var testClass = testDiv.attr("class");
}
var end = (new Date).getTime();
alert(end-start);
这一次只用了 1.254 秒。虽然这并不完全是您所要求的,但它确实强调了生成 jQuery 对象的过程比从已生成的对象中引用某些内容需要更多的时间。
也就是说,对于大多数应用程序来说,差异可能可以忽略不计。
调用 $(this) 时,必须从已实例化的对象中调用它。$(this) 只是对该对象的引用,因此开销应该是最小的。
我可能是错的,但如果是,请纠正我。