重用jQuery对象更快,但它总是更好吗?

时间:2014-11-19 21:44:05

标签: jquery performance object-lifetime

我在工作中遇到了一些代码,如下所示:

var $divs = $('div');
var $jq   = $([1]);

$divs.each(function () {
    $jq.context = $jq[0] = this;
    // ... do stuff ...
});

perf'd以上,它似乎比在函数顶部$this = $(this);快得多。在函数内部,$jq变量有一组标准的典型jQuery方法(称为.hasClass(), .data(), .find(), ...),代码按预期工作。

我想知道这里的权衡是什么;也就是你每次都没有构建一个新对象会失去什么?我只是失去了“历史”(即.pushStack(), .end(), .andSelf(), ...)?我应该一直这样做吗?

另外,这是一个命名模式吗?我不能为我的生活弄清楚如何在谷歌上研究这个。

1 个答案:

答案 0 :(得分:1)

这让我感到疯狂的微观优化。在基本情况下,确保重用对象的速度要快一个数量级。但缓存当前对象的重点是节省后续操作的时间;在宏观计划中,除非您正在处理数十万元素,否则无关紧要(不要这样做。)

你输了什么

  1. 理智的范围:通过将对象存储在迭代的外部范围中,您将打破回调的关闭。显而易见的例子是,如果你console.log($jq)在这里,所有日志条目都将引用同一个对象(循环中的最后一个对象)与this对应的每个迭代都是唯一的。

  2. 可读性var $this = $(this)$jq.context = $jq[0] = this读取/理解要快得多。

  3. 关于“历史”,我不知道你在这里会失去什么。在任何一种情况下,你都是从一个特定的对象开始,所以你在那里进行的任何搜索都会被记录下来。