我在工作中遇到了一些代码,如下所示:
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(), ...
)?我应该一直这样做吗?
另外,这是一个命名模式吗?我不能为我的生活弄清楚如何在谷歌上研究这个。
答案 0 :(得分:1)
这让我感到疯狂的微观优化。在基本情况下,确保重用对象的速度要快一个数量级。但缓存当前对象的重点是节省后续操作的时间;在宏观计划中,除非您正在处理数十万元素,否则无关紧要(不要这样做。)
理智的范围:通过将对象存储在迭代的外部范围中,您将打破回调的关闭。显而易见的例子是,如果你console.log($jq)
在这里,所有日志条目都将引用同一个对象(循环中的最后一个对象)与this
对应的每个迭代都是唯一的。
可读性:var $this = $(this)
比$jq.context = $jq[0] = this
读取/理解要快得多。
关于“历史”,我不知道你在这里会失去什么。在任何一种情况下,你都是从一个特定的对象开始,所以你在那里进行的任何搜索都会被记录下来。