Подтвердить что ты не робот

Использует ли $this вместо $(this) обеспечение повышения производительности?

Предположим, что у меня есть следующий пример:

Пример 1

$('.my_Selector_Selected_More_Than_One_Element').each(function() {
    $(this).stuff();
    $(this).moreStuff();
    $(this).otherStuff();
    $(this).herStuff();
    $(this).myStuff();
    $(this).theirStuff();
    $(this).children().each(function(){
        howMuchStuff();
    });
    $(this).tooMuchStuff();
    // Plus just some regular stuff
    $(this).css('display','none');
    $(this).css('font-weight','bold');
    $(this).has('.hisBabiesStuff').css('color','light blue');
    $(this).has('.herBabiesStuff').css('color','pink');
}

Теперь это может быть:

Пример 2

$('.my_Selector_Selected_More_Than_One_Element').each(function() {
    $this = $(this);
    $this.stuff();
    $this.moreStuff();
    $this.otherStuff();
    $this.herStuff();
    $this.myStuff();
    $this.theirStuff();
    $this.children().each(function(){
        howMuchStuff();
    });
    $this.tooMuchStuff();
    // Plus just some regular stuff
    $this.css('display','none');
    $this.css('font-weight','bold');
    $this.has('.hisBabiesStuff').css('color','light blue');
    $this.has('.herBabiesStuff').css('color','pink');
}

Точка - это не фактический код, а использование $(this), когда оно используется более одного раза/два раза/три раза или более.

Мне лучше работать с использованием примера два, чем пример один (может быть, с объяснением почему или почему нет)?

EDIT/NOTE

Я подозреваю, что два лучше одного; то, что я немного боялся, наносил мой код с помощью $this и непреднамеренно вводил потенциально сложную ошибку, когда я неизбежно забывал добавить $this к обработчику событий. Так что я должен использовать var $this = $(this) или $this = $(this) для этого?

Спасибо!

ИЗМЕНИТЬ

Как указывает Скотт, это считается кешированием в jQuery.

http://jquery-howto.blogspot.com/2008/12/caching-in-jquery.html

Джаред

4b9b3361

Ответ 1

Да, определенно используйте $this.

Новый объект jQuery должен быть создан каждый раз, когда вы используете $(this), а $this хранит один и тот же объект для повторного использования.


A тест производительности показывает, что $(this) значительно медленнее, чем $this. Однако, поскольку обе выполняют миллионы операций в секунду, это вряд ли будет иметь какое-либо реальное влияние, но лучше использовать повторное использование объектов jQuery. Когда возникают реальные последствия для производительности, когда селектор, а не объект DOM, повторно передается в конструктор jQuery - например, $('p').


Что касается использования var, снова всегда используйте var для объявления новых переменных. Таким образом, переменная будет доступна только в функции, в которой она объявлена, и не будет конфликтовать с другими функциями.


Еще лучше, jQuery предназначен для использования с цепочкой, поэтому используйте это, когда это возможно. Вместо того, чтобы объявлять переменную и вызывающие функции на нее несколько раз:

var $this = $(this);
$this.addClass('aClass');
$this.text('Hello');

... объединить функции вместе, чтобы сделать ненужную дополнительную переменную:

$(this).addClass('aClass').text('Hello');

Ответ 2

Перейдите на страницу с jQuery и запустите ее в консоли. Я знаю, что это ужасно, но вы можете видеть, что $выигрывает каждый раз.

var time = new Date().getTime();
$('div').each(function() {
  $(this).addClass('hello');
  $(this).removeClass('hello');
  $(this).addClass('hello');
  $(this).removeClass('hello');
  $(this).addClass('hello');
  $(this).removeClass('hello');
  $(this).addClass('hello');
  $(this).removeClass('hello');
  $(this).addClass('hello');
  $(this).removeClass('hello');
  $(this).addClass('hello');
  $(this).removeClass('hello');
  $(this).addClass('hello');
  $(this).removeClass('hello');
});
var now = new Date().getTime();
console.log(now- time);

var var_time = new Date().getTime();
$('div').each(function() {
  var $this = $(this);
  $this.addClass('hello');
  $this.removeClass('hello');
  $this.addClass('hello');
  $this.removeClass('hello');
  $this.addClass('hello');
  $this.removeClass('hello');
  $this.addClass('hello');
  $this.removeClass('hello');
  $this.addClass('hello');
  $this.removeClass('hello');
  $this.addClass('hello');
  $this.removeClass('hello');
  $this.addClass('hello');
  $this.removeClass('hello');
});
var var_now = new Date().getTime();
console.log(var_now - var_time);

Ответ 3

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

Это еще более важно, если ваш объект jquery был создан с помощью сложного селектора.

Кроме того, в вашем примере псевдокода вы обычно можете использовать цепочку на $(this).

Пример:

$(this).addClass("someclass").css({"color": "red"});

Ответ 4

@Box9 полностью на месте. Я не могу сказать вам, сколько раз мне приходится реорганизовывать jQuery, пользователи b/c не используют кеширование.

Я бы также добавил, что в сочетании с кэшированием люди должны научиться этому:

var $element = $("#elementId"),
    elementLength = $element.length,
    elementText = $element.text(),
    someString = "someValue",
    someInt = 0,
    someObj = null;

вместо этого:

var $element = $("#elementId");
var elementLength = $element.length;
var elementText = $element.text();
var someString = "someValue";
var someInt = 0;
var someObj = null;