代码之家  ›  专栏  ›  技术社区  ›  jairajs89

javascript:函数多次运行的神秘延迟

  •  0
  • jairajs89  · 技术社区  · 14 年前

    下面的函数只返回文档中具有指定标记名的of元素。由于某些原因,对函数的连续调用的执行速度越来越慢。我已经对它进行了全面的测试,并在原因中测试了for循环线,但我不明白为什么这会导致连续调用的速度减慢。

    function getElementsByTagName2(tagName){
        var arr=new Array();
        var elems=document.getElementsByTagName(tagName);
        for(var i=0, len=elems.length; i!=len; arr.push(elems[i++]));
        return arr
    }
    

    编辑:已将变量名更改为“请用户257493”。

    edit1:刚刚测试过jquery,它有同样的问题。不过,退化程度很小。

    4 回复  |  直到 14 年前
        1
  •  1
  •   Nebril    14 年前

    我已经测试过你的代码,它运行得很好。

    我的结果(迭代->所用时间(找到div):

    1。Firefox:
    0->1524(找到102)
    1->1534(找到102)
    2->1518(找到102)
    3->1528(找到102)
    4->1535(找到102)

    15->1513(找到102)
    16->1512(找到102)
    17->1513(找到102)
    18->1513(找到102)
    19->1518(找到102)

    2。铬:
    0->387(找到102)
    1->283(找到102)
    2->268(找到102)
    3->272(找到102)
    4->271(找到102)

    15->270(找到102)
    16->279(找到102)
    17->267(找到102)
    18->287(找到102)
    19->272(找到102)

        2
  •  0
  •   g.d.d.c    14 年前

    你的功能运行之间发生了什么?DOM是如何改变的?由于返回元素的数量增加,每个元素连续花费更长时间的可能性有多大?而且,推得很慢。这也很有效,可能会让你加快一点——我在重复执行中没有显示出延迟。

    function getElementsByTagName2(tagName) { 
      var arr = new Array(), 
      elems = document.getElementsByTagName(tagName); 
      for (var i = 0, len = elems.length; i != len; arr[i] = elems[i], ++i); 
      return arr; 
    }
    
        3
  •  0
  •   kennebec    14 年前

    尝试直接分配数组元素,而不进行推送。

    function getElementsByTagName2(tag, pa){
        pa= pa || document;
        tag= pa.getElementsByTagName(tag);
        var L= tag.length, A= [];
        while(L){
            A[--L]= tag[L];
        }
        return A
    }
    getElementsByTagName2('*',document.body)
    
        4
  •  0
  •   Douglas    14 年前

    原型到数组方法有相同的问题吗?

    function $A(iterable) {
      if (!iterable) return [];
      if ('toArray' in Object(iterable)) return iterable.toArray();
      var length = iterable.length || 0, results = new Array(length);
      while (length--) results[length] = iterable[length];
      return results;
    }