10

我已经使用 $.each 进行迭代有一段时间了,但我不断听到人们说要使用原生 JS 来进行循环。我非常关心性能,但我不确定是否总是可以以有意义的方式将 $.each 替换为 for。

所以我的问题是,是否可以始终将 $.each 替换为 for,如果不是,那么什么时候可以完成,什么时候不能完成的经验法则是什么。

我有一个这样的:

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

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

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

 });
4

2 回答 2

9

这就是 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也一样,并且仅在需要时分配。如果conditioncondition2是互斥的,请使用单个if (condition || condition2).

于 2009-09-01T00:06:58.307 回答
5

有人比较了forand的性能$.each

http://jquery-howto.blogspot.com/2009/06/javascript-for-loop-vs-jquery-each.html

于 2009-09-01T00:04:52.697 回答