Замена каждого jQuery на - PullRequest
       7

Замена каждого jQuery на

10 голосов
/ 01 сентября 2009

Я уже некоторое время использую $ .each для выполнения итераций, но я продолжаю слышать, как люди говорят, что нужно использовать нативный JS для циклов. Я очень обеспокоен производительностью, но я не уверен, что всегда можно заменить $ .each значимым образом на.

Итак, мои вопросы: возможно ли всегда заменить $ .each на for, и если нет, то каково практическое правило, когда это можно сделать, а когда - нет.

У меня есть каждый такой:

 $this.find("div.class").each(function (){
  var $thisparent = $(this).parent();

  if (condition) {          
   $(this).prepend($thisparent.text());
  }

  if (condition2) {          
   $(this).prepend($thisparent.text());
  }

 });

Ответы [ 2 ]

9 голосов
/ 01 сентября 2009

Это то, что jQuery делает с .each, в основном :

$.fn.each = function(callback) {
    var i, length = this.length;
    for(i = 0; i < length; ++i) {
        callback.call(this[i]);
    }
};

Так что нетрудно заменить «содержимое» вашей анонимной функции вызовом callback.call. Обязательно замените this временным объектом jQuery.

Преобразование вашего кода:

var foo = $this.find("div.class"),
    fooLength = foo.length,
    i,
    $thisparent;

for (i = 0; i < fooLength; ++i) {
    $thisparent = $(foo[i]).parent();

    if (condition) {          
        $(foo[i]).prepend($thisparent.text());
    }

    if (condition2) {          
        $(foo[i]).prepend($thisparent.text());
    }
}

Для дополнительной (потенциальной) скорости, кэшируйте foo[i] во временную. и присваивайте $thisparent только при необходимости. Если condition и condition2 являются взаимоисключающими, используйте один if (condition || condition2).

5 голосов
/ 01 сентября 2009

Кто-то сравнивал производительность for и $.each:

http://jquery -howto.blogspot.com / 2009/06 / JavaScript-для-петли-против-Jquery-each.html

...