2010-07-08 68 views
0

以下函數只是返回文檔中帶有指定標記名的元素的一個。由於某種原因,在連續調用函數時,它的執行速度會變得越來越慢。我已經徹底地測試了它,並在原因中測試了for-loop行,但是我不明白爲什麼會導致連續調用。Javascript:函數的多次運行中的神祕滯後

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 
} 

編輯:更改變量名稱,以請user257493。

EDIT1:剛剛測試過jQuery,它有相同的問題。儘管如此,降解效果不大。

+0

出於好奇,如果你長時間運行它,你會發現瀏覽器的內存使用量明顯增加嗎? – 2010-07-08 02:56:15

+0

您是否正在爲每個調用創建一個新的數組實例?在它開始減速之前有多少實例?你有沒有考慮過jQuery?它允許你建立一組元素並對這些集合進行操作 - 可能會更容易。 – Mayo 2010-07-08 02:56:16

+0

我不太明白這是做什麼。在我看來,整個函數體可以用'return document.getElementsByTagName(e)'替換。它只是一個顯示經濟放緩的例子嗎? – deceze 2010-07-08 02:58:05

回答

1

我測試了你的代碼,它似乎運行得很好。

我的結果(迭代 - >時間採取(實測值的div):

1.火狐:
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)

+0

嗯..一定要在我的電腦或瀏覽器上! – jairajs89 2010-07-08 11:29:10

0

你的函數運行之間發生了什麼? 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; 
} 
0

嘗試直接分配數組元素,而不是推送。

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) 
+0

謝謝,這給了一點速度提升。 – jairajs89 2010-07-08 04:20:07

0

原型數組方法是否有同樣的問題?

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; 
}