Доступ к "$(this)" несколько раз в пределах одной и той же функции [дубликат]
Возможный дубликат:
кэширование $(this) в jQuery является лучшей практикой?
Мне любопытно, в рамках одной и той же функции, когда $(this) вызывается несколько раз, несет ли она дополнительные накладные расходы для построения объекта jQuery в последующих вызовах? Другими словами, кэшируется ли $(this) при первом вызове? Если нет, то не лучше ли хранить $(this) в переменной и использовать эту переменную, когда $(this) понадобится впоследствии?
5 ответов:
$()является функцией конструктора jQuery.Таким образом, в
thisявляется ссылкой на элемент DOM вызова.$(this)вы просто передаетеthisв$()в качестве параметра, чтобы можно было вызвать методы и функции jQuery.Http://www.learningjquery.com/2007/08/what-is-this
Хорошие цифры: http://jsperf.com/jquery-this-vs-this-vs-chain/2
Вы обычно используете
var $this = $(this);, чтобы избежать создания нового jQuery возражайте чаще, чем это необходимо. В случае кода ниже вы создаете только один объект вместо двух/четырех. Это совершенно не связано с цепочечностью.
thisв javascript (обычно) представляет собой ссылку на объект, который вызвал текущую функцию.Обычно целью хранения
$(this)в локальной переменной является предотвращение вызова функции jQuery$()несколько раз , кэширование a jQueryizedthisдолжна помочь эффективность, если у вас есть использовать его несколько раз.
$является просто допустимым символом имени переменной и используется в качестве первого символа имени переменной обычно , чтобы поставить программиста в очередь, что это уже объект jQuery (и имеет соответствующие методы / свойства доступны).
Я видел, что эта конструкция используется довольно часто:
var someFunc = function () { var that = $(this); // you could also cache like var $this = $(this); // do stuff here... };Каждый раз, когда вы звоните
$(), будут некоторые накладные расходы на выполнение вызова, но не очень много. Я не думаю, что это было бы заметно, если бы вы не кэшировали$(this). Смотрите Итак запись в кэше jquery $(this)
Я сделал быстрый тест, чтобы увидеть, есть ли дополнительные накладные расходы на построение объекта jQuery с использованием$:
var start = (new Date).getTime(); for(var i=0; i<1000000; i++) { var testClass = $("#testDiv").attr("class"); } var end = (new Date).getTime(); alert(end-start);Все, что я делаю здесь, это Запускаю код 1 000 000 раз, чтобы увидеть, сколько времени требуется для хранения класса объекта jQuery на странице в переменной. Это заняло около 4,286 секунды. Затем я изменил его для ссылки на уже сохраненный объект:
var start = (new Date).getTime(); var testDiv = $("#testDiv"); for(var i=0; i<1000000; i++) { var testClass = testDiv.attr("class"); } var end = (new Date).getTime(); alert(end-start);Это заняло всего 1,254 секунды. Хотя это не совсем то, о чем вы просите, это подчеркивает, что процесс создание объекта jQuery занимает больше времени, чем ссылка на что-то из уже созданного объекта.
Тем не менее, разница, вероятно, будет незначительной для большинства приложений.
Каждый раз, когда вычисляется выражение
$(this), вызывается Фабричная функция jQuery, в результате чего создается новый экземпляр jQuery. Однако штраф за эффективность этого процесса ничтожно мал. Однажды я подсчитал, что это занимает всего несколько микросекунд (миллионная доля секунды).Лично я не беспокоюсь о том, чтобы иметь
$(this)несколько раз в теле функции. Кэширование экземпляра jQuery (var $this = $(this);) - это опция, но я ее не делаю. (Я случайно нахожу$thisимя уродливым, по сравнению к$( this ), и я понимаю, что большинство людей не согласны со мной здесь.)
Когда вызывается $(this), он должен быть вызван из уже созданного объекта. $(this) - это просто ссылка на этот объект, и поэтому накладные расходы должны быть минимальными.
Я могу ошибаться, но, пожалуйста, поправьте меня, если это так.
Comments