連鎖とは、返されたオブジェクトに対してメソッドを呼び出すことです。それについて本質的に良いことも悪いこともありません。好きな人もいれば、嫌いな人もいます。
メモリリークに関しては、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することはできません。
ここに例があります...
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"
要素を参照している場合でも当てはまります。その理由は、プロパティが元のDOM選択を行ったjQueryオブジェクトを参照しているため、存続.prevObject
する限りノードが解放されることはないためです。jq_obj