为什么这个循环逐渐变慢?

时间:2016-12-09 17:18:01

标签: javascript jquery performance

for (i = 0; i < $('body > p font i').length; i++) {
    current = [$('body > p font i').eq(index), $('body > p font i').eq(index).index('body > p font u, body > p font i')];
    getState(current[1]);
}

function getState(index) {
    // Lookup the object's index, then crawl up until you find a match
    while ($('body > p font u, body > p font i').eq(--index).filter('u').length == 0);
    console.log($('body > p font u, body > p font i').eq(index).text());
}

相当简单的问题。我正在针对选择器过滤器迭代jQuery结果集,直到找到匹配项,然后按照结果集向上攀升。

此循环运行的时间越长,它变得越慢,几乎呈指数级。

1 个答案:

答案 0 :(得分:2)

您正在每次迭代中搜索DOM树,这是一项昂贵的操作,解决方案是缓存:

var nodes = $('body > p font i');
for (var i = 0, size = nodes.length; i < size; i++) {
    current = [nodes.eq(index),nodes.eq(index).index('body > p font u, body > p font i')];
}