速度测试:while()循环与jQuery的each()函数

时间:2011-10-15 09:17:55

标签: javascript jquery

我有一个名为targets的对象数组,我想在每个对象上执行一个函数。第一种方法:

targets.each(function() {
    if (needScrollbars($(this))) {
        wrap($(this), id);
        id = id + 1;
    }
});

此方法的执行速度约为125毫秒。第二种方法是:

var i=0;
while (targets[i] != undefined) {
    if (needScrollbars($(this))) {
        wrap($(this), id);
        id = id + 1;
    }
    i = i+1;
}

这第二种方法需要高达1385ms才能执行,我会理解这一点。有没有人知道为什么裸骨循环运行速度慢于我只是在猜测(只是猜测)比简单循环更多的功能?

谢谢。

2 个答案:

答案 0 :(得分:2)

他们完全不同。第一个示例中的this是当前target,在第二个示例中this是“外部”this。您应该将第二个示例更改为:

var i=0;
while (targets[i] != undefined) {
    var cur = $(targets[i]);
    if (needScrollbars(cur)) {
        wrap(cur, id);
        id = id + 1;
    }
    i = i+1;
}

相关的quote

  

更重要的是,回调是在当前DOM元素的上下文中触发的,因此关键字this指的是元素。

但我不知道为什么你没有写成:

for (var i = 0; i < targets.length; i++)
{
    var cur = $(targets[i]);
    if (needScrollbars(cur)) {
        wrap(cur, id);
        id = id + 1;
    }
}

最后,each“方法”更容易理解(对我而言)。

答案 1 :(得分:2)

您的第二种方法在功能上与第一种方法不同。

为什么呢?因为它使用this,因此在全局范围内使其成为closure。当然第二种方法更慢:它不断地弹出由全局范围构成的jQuery对象。再次尝试使用以下基准:

var i=0;
while (targets[i] !== undefined) {
    var o = $(targets[i]);
    if (needScrollbars(o)) {
        wrap(o, id);
        id++;
    }
    i++;
}