4

我的一位同事建议我使用 jQuery.each()函数而不是 javascriptfor循环来遍历DOM我页面上的元素,我不是 jQuery 的新手,但从未理解开发人员倾向于使用 javascript 循环的真正原因.each()。谁能给我解释一下?

4

5 回答 5

6

如果要使用for循环进行迭代,则必须增加索引:

for(var i=0; i<arr.length; ++i) {

然后您必须使用索引获取实际值:

var value = arr[i];

.each为您完成这两项并将值传递给函数:

$(...).each(function(i, value) {
    // actual interesting part of the loop...
});

它只是为您节省了增加索引并获取该索引值的样板代码。

函数中定义的变量.each也是封闭的(即在闭包内),因此等效代码(考虑循环和变量闭包,加上设置this,以及在false返回值上中断)可能类似于:

(function() {
    for(var i=0; i<arr.length; ++i) {

        var ret = (function(index, value) {
            // actual interesting part of the loop...
        }).call(arr[i], i, arr[i]);

        if(ret === false) break;
    }
})();

这是相当多的类型。

在执行性能方面,.each它(不出所料)比原始for循环慢,因为它比原始for循环做得更多。

于 2013-04-24T12:50:31.617 回答
2

它非常易于使用

但正如这个测试结果所示,它很慢。 http://jsperf.com/jquery-each-vs-for-loop/214

于 2013-04-24T12:47:11.227 回答
1

因为它更容易和更清洁

$jqExpr.each(function(i, el){
   /* YOUR CODE */
});

than

for(var i=0; i < $jqQExpr.length; i++){
  el = $jqExp[i];
  /* YOUR CODE */
}
于 2013-04-24T12:51:19.417 回答
1

它更慢,但更具表现力(更短),并且还设置了闭包。此外,在 jQuery 集合上,它很好地集成到了链接中;而对于普通数组,我建议使用本机.forEach方法

于 2013-04-24T12:51:41.147 回答
0

对我来说,如果你使用 each 而不是 for,还有一个重要的好处关闭副作用。

考虑下面的代码(我使用的是咖啡脚本,因为我发现了......)它会在所有链接上使用其 href 值发出警报:

$("a").each (i, e)->
  href = $(e).attr('href')
  $(e).on "click" alert(href)

如果您将其“翻译”成一个简单的 for 循环,例如:

for e in $("a")
  href = $(e).attr('href')
  $(e).on "click" alert(href)

此代码不起作用,因为 href 变量未包含在闭包中...

于 2014-02-20T11:57:35.080 回答