重用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);})