Я один вклад антишаблоном здесь, который является «утечка средней цепи».
Одним из преимуществ JQuery является его цепочка API, который позволяет продолжать изменять, фильтровать и манипулировать элементы:
$(".message").addClass("unread").find(".author").addClass("noob");
В конце этой цепи у вас есть объект JQuery со всеми». message .author ", но , что объект ссылается на объект и объект с исходными элементами« .message ». Вы можете получить их с помощью метода .end()
и сделать что-то для них:
$(".message")
.find(".author")
.addClass("prolific")
.end()
.addClass("unread");
Теперь, когда используется таким образом, нет никаких проблем с утечками. Однако, если вы назначаете результат цепочки переменной, которая имеет долгий срок службы, обратные ссылки на более ранние наборы сохраняются и не могут быть собраны в мусор, пока переменная не выйдет из сферы действия. Если эта переменная является глобальной, ссылки никогда не выходят за рамки.
Так, например, предположим, что вы читали в одном из сообщений в блоге 2008 года, что $("a").find("b")
был «более эффективным», чем $("a b")
(хотя его не стоит даже думать о такой микро-оптимизации). Вы решили, что вам нужна страница для всей глобальной держать список авторов, так что вы делаете это:
authors = $(".message").find(".author");
Теперь у вас есть объект JQuery со списком авторов, но он также ссылается на объект JQuery, который это полный список сообщений. Вы, вероятно, никогда не будете использовать его или даже знаете, что он есть, и он занимает память.
Обратите внимание, что утечки могут происходить только с методами, которые выбирают новых элементов из существующего набора, например, .find
, .filter
, .children
и т.д. документы показывают, выполняемые при возвращении нового набора. Просто с помощью построения цепочки API не вызывает утечку, если цепь имеет простые методы нефильтрующих как .css
, так что это нормально:
authors = $(".message .author").addClass("prolific");
Вот пример: http://jsfiddle.net/qTu6y/8/ Вы можете использовать Chrome «Возьмите снимок» в профилировщике, чтобы увидеть, что каждый запуск этого блока кода потребляет около 20 МБ ОЗУ. (Во время тестирования я действительно попал в «Сценарий, в котором слишком много ошибок RAM на хроме») – Raynos
+1 для «тех из нас, кто приходит с фона Java» ... и для ясного объяснения. – Thimmayya
$ (this) .addClass будет лучше для производительности в последнем случае, так как «this» представляет собой набор элементов ядра JS DOM (который является тем, что объекты JQuery обычно обертывают с использованием шаблона адаптера), и JQ не будет снова войдите в DOM или проанализируйте каждый элемент DOM на странице в случае