我在工作中遇到了一些代码,如下所示:
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()、...)吗?我应该一直这样做吗?
此外,这是命名模式吗?我怎么也想不出如何在 Google 上研究这个问题。
请您参考如下方法:
这让我觉得这是一个疯狂的微观优化。当然,在基本情况下,重用对象的速度要快一个数量级。但缓存当前对象的全部目的是为了节省后续操作的时间;在宏伟的计划中,除非您正在处理数十万元素(不要这样做),否则这并不重要。
你失去了什么
合理范围:通过将对象存储在迭代的外部范围中,您将破坏回调的闭包。一个明显的例子是,如果您在此处
console.log($jq),则所有日志条目都将引用同一个对象(循环中的最后一个对象),而不是this每次迭代都是唯一的。可读性:
var $this = $(this)的读取/理解速度比$jq.context = $jq[ 0] = 这个。
关于“历史”,我不明白你会在这里失去什么。无论哪种情况,您都从特定对象开始,因此您从那里进行的任何搜索都将被记录为相同的。
