Доступ к "$(this)" несколько раз в пределах одной и той же функции [дубликат]




Возможный дубликат:
кэширование $(this) в jQuery является лучшей практикой?






Мне любопытно, в рамках одной и той же функции, когда $(this) вызывается несколько раз, несет ли она дополнительные накладные расходы для построения объекта jQuery в последующих вызовах? Другими словами, кэшируется ли $(this) при первом вызове? Если нет, то не лучше ли хранить $(this) в переменной и использовать эту переменную, когда $(this) понадобится впоследствии?

464   5  

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 jQueryized this должна помочь эффективность, если у вас есть использовать его несколько раз.

$ является просто допустимым символом имени переменной и используется в качестве первого символа имени переменной обычно , чтобы поставить программиста в очередь, что это уже объект jQuery (и имеет соответствующие методы / свойства доступны).

$this vs $(this) в 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

    Ничего не найдено.