for循環(huán)
在for循環(huán)中你會(huì)去迭代一些數(shù)組元素或者一些HTML元素。for循環(huán)常常如此:
for (var i = 0; i < myarray.length; i++) { // do something with myarray[i] }
這樣寫的問題在于,每一次迭代的時(shí)候都會(huì)計(jì)算數(shù)組的長(zhǎng)度,尤其在這個(gè)參數(shù)不是一個(gè)數(shù)組而是一組HTML元素的時(shí)候會(huì)降低你的程序的性能。
HTML元素的集合在頁(yè)面上,這樣每次都會(huì)去再頁(yè)面上查找相應(yīng)的元素,這是非常耗時(shí)的。所以對(duì)于for循環(huán),你需要預(yù)先保存數(shù)組的長(zhǎng)度,這樣寫:
for (var i = 0, max = myarray.length; i < max; i++) { // do something with myarray[i] }
這樣緩存了參數(shù)的長(zhǎng)度,在每次迭代的時(shí)候就不用再去查找計(jì)算了。
在查找HTML元素集合的時(shí)候,緩存參數(shù)長(zhǎng)度可以帶來可觀的性能提升,Safari下面提高兩倍的速度,在IE7下面提高190倍的速度。
需要注意的是,當(dāng)你需要操作修改DOM元素的數(shù)量的時(shí)候,你肯定希望這個(gè)值是隨時(shí)更新的而不是一個(gè)常量。
使用下面的單一var模式,你也可以把var提到循環(huán)之外:
function looper() { var i = 0, max, myarray = []; // ... for (i = 0, max = myarray.length; i < max; i++) { // do something with myarray[i] } }
這個(gè)模式可以增強(qiáng)整個(gè)代碼的連續(xù)性,但是不好的一點(diǎn)是當(dāng)你重構(gòu)代碼的時(shí)候復(fù)制粘貼就沒那么容易了。例如:如果你想在其他函數(shù)中也使用這個(gè)循環(huán),那你需要確定在新的函數(shù)中處理好了i和max(或許還需要?jiǎng)h掉這個(gè))。
這個(gè)函數(shù)還有兩個(gè)點(diǎn)可以優(yōu)化的:
- 可以少一個(gè)變量(不需要max)
- 遞減到0,一個(gè)數(shù)字與0比較比這個(gè)數(shù)字與另外一個(gè)數(shù)字比較更快
所以就可以寫為:
var i, myarray = []; for (i = myarray.length; i--;) { // do something with myarray[i] }
針對(duì)第二點(diǎn):
var myarray = [], i = myarray.length; while (i--) { // do something with myarray[i] }
這是兩個(gè)比較微小的點(diǎn)的優(yōu)化。另外,JSLint可能對(duì)于i–會(huì)有意見。
出處:rockux
責(zé)任編輯:bluehearts
上一頁(yè) 如何編寫高質(zhì)量的Javascript代碼 [3] 下一頁(yè) 如何編寫高質(zhì)量的Javascript代碼 [5]
◎進(jìn)入論壇網(wǎng)頁(yè)制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。
|