在 JavaScript 中,函数通常是短暂的——尤其是当由浏览器托管时。然而,一个函数的作用域可能比函数的寿命更长。例如,当您创建一个闭包时,就会发生这种情况。如果您想防止一个jQuery
对象被长时间引用,您可以null
在完成该变量或使用间接创建闭包时将其分配给引用它的任何变量。例如:
var createHandler = function (someClosedOverValue) {
return function () {
doSomethingWith(someClosedOverValue);
};
}
var blah = function () {
var myObject = jQuery('blah');
// We want to enable the closure to access 'red' but not keep
// myObject alive, so use a special createHandler for it:
var myClosureWithoutAccessToMyObject = createHandler('red');
doSomethingElseWith(myObject, myClosureWithoutAccessToMyObject);
// After this function returns, and assuming doSomethingElseWith() does
// not itself generate additional references to myObject, myObject
// will no longer have any references and be elligible for garbage
// collection.
}
因为jQuery(selector)
可能最终不得不运行昂贵的算法,甚至对于浏览器无法直接处理的复杂表达式稍微遍历 DOM 树,所以最好缓存返回的对象。此外,正如其他人所提到的,为了代码清晰,最好缓存返回的对象以避免多次键入选择器。即,DRY 代码通常比 WET 代码更容易维护。
然而,每个 jQuery 对象都有一些开销。因此,将大量 jQuery 对象存储在全局变量中可能是一种浪费——除非您确实需要对大量这些对象进行操作并且仍然将它们视为不同的。在这种情况下,您可以通过直接缓存 DOM 元素的数组并使用jQuery(DOMElement)
构造函数来节省内存,该构造函数在迭代它们时基本上应该是免费的。
但是,正如人们所说,您只能通过对不同方法进行基准测试来了解针对您的特定情况的最佳方法。即使理论看起来很合理,也很难预测现实;-)。