Цепочка просто вызывает метод для возвращаемого объекта. В этом нет ничего хорошего или плохого. Некоторым нравится, некоторые нет.
Что касается утечек памяти, Jquery действительно держит кешированный набор объектов JQuery, когда вы сделали DOM обход. Это не имеет особого отношения к цепочке, поскольку связанный объект 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
ссылается на объект jQuery, который сделал исходный выбор DOM, поэтому узлы никогда не выпускаются до тех пор, пока выживает jq_obj
.
Помимо дизайна, в котором я не вижу, как это может повлиять на синтаксис, другие отрицательные эффекты, о которых вы просите, кажутся возможными только как слабость реализации конкретного интерпретатора. –
«много людей, связывающих нас» => ссылки? – Christophe
В моей работе, и я видел примеры здесь недавно. Я посмотрю, смогу ли я их выкопать, один наверняка был на недавнем вопросе о щедрости, когда ответчик сказал вопросчику: «Прекратите цепочку, вот как хипстерс код и, вероятно, причина ваших проблем, которые вы испытываете» :) – KodeKreachor