我有一个名为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才能执行,我会理解这一点。有没有人知道为什么裸骨循环运行速度慢于我只是在猜测(只是猜测)比简单循环更多的功能?
谢谢。
答案 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++;
}