重用jQuery对象更快,但它总是更好吗?
我在工作中遇到了一些代码,如下所示:重用jQuery对象更快,但它总是更好吗?,jquery,performance,object-lifetime,Jquery,Performance,Object Lifetime,我在工作中遇到了一些代码,如下所示: var $divs = $('div'); var $jq = $([1]); $divs.each(function () { $jq.context = $jq[0] = this; // ... do stuff ... }); 我在上面提到过,它似乎比使用$this=$(this)要快得多位于函数顶部。在函数内部,$jq变量有一个标准的jQuery方法组合,这些方法被称为它的一部分(.hasClass(),.data(),.f
var $divs = $('div');
var $jq = $([1]);
$divs.each(function () {
$jq.context = $jq[0] = this;
// ... do stuff ...
});
我在上面提到过,它似乎比使用$this=$(this)要快得多代码>位于函数顶部。在函数内部,$jq
变量有一个标准的jQuery方法组合,这些方法被称为它的一部分(.hasClass(),.data(),.find(),…
),代码按预期工作
我想知道这里的权衡是什么;i、 e.如果每次都不构建新对象,您会损失什么?我是否正在丢失“历史记录”(即.pushStack(),.end(),.andSelf(),…
)?我应该一直这样吗
还有,这是命名模式吗?我一辈子都不知道如何在谷歌上研究这个问题。这让我觉得是一个疯狂的微优化。当然,在基本情况下,重用对象的速度要快一个数量级。但是缓存当前对象的全部目的是在后续操作中节省时间;在grand scheme中,除非您正在处理数十万个元素(不要这样做)
你失去了什么
健全范围:通过将对象存储在迭代的外部范围中,您正在打破回调的关闭。一个明显的例子是,如果您在这里console.log($jq)
,那么所有日志条目都将引用相同的对象(循环中的最后一个对象),而this
对于每个迭代都是唯一的
可读性:var$this=$(this)
比$jq.context=$jq[0]=this
快得多
关于“历史”,我不认为你会在这里失去任何东西。在这两种情况下,您都是从一个特定的对象开始的,因此从该对象开始的任何搜索都会被记录下来。您可以链接到perf吗?↑↑↑ 是的,不确定您是否将其正确比较为$this=$(this)
正在jQuery对象内包装此
,但您不能使用:$jq.context=$jq[0]=this代码>@Mathletics:添加了一个指向jsperf的链接@A.Wolff-我明白这就是为什么重用的$jq
更快,但我正在试图找出折衷的办法。例如,“是的,它更快了,但它不再正确地支持end()
,它会杀死一只小猫。”我应该尽可能地使用上述模式而不是$this=$(this)
?嘿,Mathletics——你知道缓存是如何工作的吗?这对我来说是全新的,我从未见过它的惯例:$jq.context=$jq[0]=This;这里发生了什么?@jamesemanon$jq.context=$jq[0]=此
设置第2行上设置的jquery对象的根节点和context
属性,var$jq=$([1])
,结果是一个基本上与$相同的对象(此)
@Mathletics听起来,在不需要缓存的情况下,重用对象非常适合在集合(如上所述)上进行迭代,而且在循环体中,它更像是一种单例使用,而不是一次性使用,除非闭包查找非常昂贵。另外(澄清点),console.log($jq)
只在之后包含相同的DOM节点。每个循环都不在内部。@Impirator我不知道你的意思。Re:console.log,日志中的所有对象都将相同;这是浏览器记录变化对象的方式的问题。循环完成后,所有日志条目都将包含相同的对象。(如果您在每次迭代中暂停并检查,您将看到当前对象。)@Mathletics我猜Chrome已经解决了这个问题;打开控制台并在此页面上插入以下内容:var$divs=$('div');var$jq=$([1])$每个(函数(){$jq.context=$jq[0]=this;console.log('object',$jq);})代码>