高效js

  1. /** 
  2. 高效 Javascript 編碼 
  3.  
  4. Fast Loops 
  5. 循環是大多數腳本最基本的一個部分,在大多數情況下,循環不會有任何效率問題。 
  6. 但是,通過優化循環條件,還是可以讓循環運行的更快一些 
  7. 看下面的幾個例子 
  8. */  
  9.   
  10. for(var i = 0 ; i < document.getElementsByTagName('tr').length ; i++){  
  11.     document.getElementsByTagName('tr')[i].className = "newclass";  
  12.     document.getElementsByTagName('tr')[i].style.color = "red";  
  13.     ...  
  14. }  
  15.   
  16. var rows = document.getElementsByTagName("tr");  
  17. for(var i = 0 ; i < rows.length ; i++){  
  18.     rows[i].className = "newclass";  
  19.     rows[i].style.color = "red";  
  20.     ...  
  21. }  
  22. /* 
  23. 上面兩個都不是高效的,getElementsByTagName返回一個動態的對象,而不是一個靜態的數組。 
  24. 每次循環的時候,解析器都會再次檢查對象,並且需要重新計算出有多少對象被引用。 
  25. 下面是一種好一些的方式來進行這種循環(下面的第一種通常是最好的方式) 
  26. */  
  27.   
  28. /** 
  29. 這種寫法稍微有點不太好理解 
  30. 這種方式的理解需要徹底的瞭解for循環 
  31. for循環有兩個分號,等於說可以傳3個參數 
  32. 第一段實際上就是用來定義變量的 
  33. 第二段實際上就是傳入一個表達式 
  34. 第三段一般傳入的遞增或者遞減 
  35.  
  36. 我們需要仔細分析的第二段 
  37. 只要是個表達式 
  38. 我們平常使用的是i>1 , i< 100之類的 
  39. 仔細看下,這種東西實際上返回的不是false就是true 
  40. 所以,我們在這個地方傳入的是false或者true的boolean值就行了 
  41. 而這段代碼裏面傳入的是 
  42. row = rows[i] 
  43. 實際上判斷boolean值的就是row這個變量 
  44. 只要變量row轉換爲boolean的時候爲true就繼續進行循環 
  45. 而rows[i]的i超過一定大小之後rows[i]就是null 
  46. 那麼row也是null,null轉換爲boolean值的時候就是==false 
  47. 所以會停止循環,也就是循環判斷終止的條件 
  48. */  
  49. var rows = document.getElementsByTagName("tr");  
  50. for(var i = 0 , row;row = rows[i];i++){  
  51.     row.className = 'newclass';  
  52.     row.style.color = 'color';  
  53.     ...  
  54. }  
  55.   
  56. var rows = document.getElementsByTagName("tr");  
  57. for(var i = rows.length - 1; i > -1;i--){  
  58.     var row = rows[i];  
  59.     row.className = 'newclass';  
  60.     row.style.color = 'color';  
  61.     ...  
  62. }  
  63.   
  64. /*這下面這一種是我們經常能看到的,雖然做了變量緩存,但是增加了一個不必要的變量m,增加了內存的使用量*/  
  65. var rows = document.getElementsByTagName("tr");  
  66. for(var i = 0 , m = rows.length; i < m;i++){  
  67.     var row = rows[i];  
  68.     row.className = 'newclass';  
  69.     row.style.color = 'color';  
  70.     ...  
  71. }  
  72.   
  73. /* 
  74. Reduce reflow 
  75.  
  76. 每次我們添加一個元素到document中,瀏覽器必須重新reflow整個page,所有的元素都會被重新設置位置和渲染 
  77. 你添加的元素次數越多,reflow的次數也就越多。 
  78. 所以應該減少reflow的次數,這樣頁面的展現也就越快。 
  79. 如果你需要添加一個新元素,並且這個元素有很多子節點。 
  80. 應該先將子元素添加到新元素上面,然後纔將新元素append到頁面上 
  81. 這樣只需要一次的reflow 
  82.  
  83. 但是有一種情況 
  84. 就是你添加一個節點,並且需要給他新加一些相鄰節點 
  85. 這種情況下可以新建一個fragment,然後將這些節點加入到fragment上面 
  86. 最後將fragment添加到document中。 
  87. */  
  88.   
  89. /* 
  90. Assign multiple styles 
  91.  
  92. 我們通過js來修改元素的style的時候 
  93. 經常會這麼寫 
  94. */  
  95. oElement.style.position = "absolute";  
  96. oElement.style.top = "0px";  
  97. oElement.style.left = "0px";  
  98. ...etc...  
  99.   
  100. /*再看另外一種寫法*/  
  101. oElement.setAttribute("style","position:absolute;top:0px;left:0px;...etc...");  
  102.   
  103. /*這種方式也可以將reflow的次數降低到一次*/ 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章