链接只是在返回的对象上调用方法。本质上没有什么好或坏的。有些人喜欢,有些人不喜欢。
关于内存泄漏,当您完成 DOM 遍历时,jQuery 确实保留了一组缓存的 jQuery 对象。这与链接并没有太大关系,因为引用的 jQuery 对象会做同样的事情,但我想如果你保持对该对象的永久引用,它可能会导致泄漏。
例如,如果您这样做...
var jq_obj = $('.my_class').parents('.another_class');
... jQuery 对象现在具有对具有该类的".my_class"
元素的祖先的引用。".another_class"
问题是你可以这样做......
jq_obj.end();
...您现在可以参考".my_class"
所选的原始元素。这意味着保留了原始参考。
因此,如果在调用 之后.parents()
,如果您停在那里(没有调用.end()
),并且如果您保留对该jq_obj
对象的全局引用,那么您现在将隐式引用".my_class"
除元素之外的所有".another_class"
元素。
因此,如果".my_class"
从 DOM 中删除任何原始元素,则由于该引用,它们不能被 GC'd。
这是一个例子......
http://jsfiddle.net/aUEFc/
// select "my_class" then traverse to a parent
var jq_obj = $('.my_class').parents('.another_class');
// remove "my_class" elements from the DOM
$('.my_class').remove();
// see if we still have a reference to "my_class" elements
var len = jq_obj.prevObject.filter('.my_class').length;
即使删除了元素,该len
变量也将是选择的元素的原始数量。".my_class"
".my_class"
即使我们的jq_obj
对象正在引用".another_class"
元素,情况也是如此。原因是该.prevObject
属性引用了进行原始 DOM 选择的 jQuery 对象,因此只要节点存在,就永远不会释放节点jq_obj
。