成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何優(yōu)化你的JS代碼

開發(fā) 前端
對于JS代碼的優(yōu)化,實際上有很多的情況,有些影響是比較小的,而有些是比較嚴(yán)重的,本文中,我把幾個我認(rèn)為影響比較嚴(yán)重的情況列出來,供大家參考。

JS代碼的執(zhí)行效率往往直接影響了頁面的性能,有的時候,實現(xiàn)同樣的功能,不同的JS代碼往往在效率上相差很多,有的時候僅僅是由于我們的書寫習(xí)慣導(dǎo)致的,當(dāng)然在高級點的瀏覽器中,它們大多都已經(jīng)幫我們優(yōu)化了,但是在中國,萬惡的IE6仍然大量的存在,我們不得不去考慮它。對于JS代碼的優(yōu)化,實際上有很多的情況,有些影響是比較小的,而有些是比較嚴(yán)重的,本文中,我把幾個我認(rèn)為影響比較嚴(yán)重的情況列出來,供大家參考。

1、字符串的拼接

 字符串的拼接在我們開發(fā)中會經(jīng)常遇到,所以我把其放在首位,我們往往習(xí)慣的直接用+=的方式來拼接字符串,其實這種拼接的方式效率非常的低,我們可以用一種巧妙的方法來實現(xiàn)字符串的拼接,那就是利用數(shù)組的join方法。

  1. <div class="one" id="one"></div>   
  2. <input type="button" value="效率低" onclick="func1()" />   
  3. <input type="button" value="效率高" onclick="func2()" /> 
  1. //效率低的   
  2. function func1(){   
  3.     var start = new Date().getTime();   
  4.     var template = "";   
  5.     for(var i = 0; i < 10000; i++){   
  6.         template += "<input type='button' value='a'>";   
  7.     }   
  8.     var end = new Date().getTime();   
  9.     document.getElementById("one").innerHTML = template;   
  10.     alert("用時:" + (end - start) + "毫秒");   
  11. }   
  12. //效率高的   
  13. function func2(){   
  14.     var start = new Date().getTime();   
  15.     var array = [];   
  16.     for(var i = 0; i < 10000; i++){   
  17.         array[i] = "<input type='button' value='a'>";   
  18.     }   
  19.     var end = new Date().getTime();   
  20.     document.getElementById("one").innerHTML = array.join("");   
  21.     alert("用時:" + (end - start) + "毫秒");   
  22. }   

我們看看其在不同瀏覽器下執(zhí)行的情況

我們會發(fā)現(xiàn),在IE6下其差別是相當(dāng)明顯的,其實這種情況在IE的高版本中體現(xiàn)的也非常明顯,但是在Firefox下卻沒有多大的區(qū)別,相反第二種的相對效率還要低點,不過只是差別2ms左右,而Chrome也和Firefox類似。另外在這里順便說明一下,在我們給數(shù)組添加元素的時候,很多人喜歡用數(shù)組的原生的方法push,其實直接用arr[i]或者arr[arr.length]的方式要快一點,大概在10000次循環(huán)的情況IE瀏覽器下會有十幾毫秒的差別。

#p#

2、for循環(huán)

for循環(huán)是我們經(jīng)常會遇到的情況,我們先看看下面例子:

  1. <input type="button" value="效率低" onclick="func1()" />   
  2. <input type="button" value="效率高" onclick="func2()" /> 
  1. var arr = [];   
  2. for(var i = 0; i < 10000; i++){   
  3.     arr[i] = "<div>" + i + "</div>";   
  4. }   
  5. document.body.innerHTML += arr.join("");   
  6.     
  7. //效率低的   
  8. function func1(){   
  9.     var divs = document.getElementsByTagName("div");   
  10.     var start = new Date().getTime();   
  11.     for(var i = 0; i < divs.length; i++){   
  12.         //"效率低"   
  13.     }   
  14.     var end = new Date().getTime();   
  15.     alert("用時:" + (end - start) + "毫秒");   
  16. }   
  17. //效率高的   
  18. function func2(){   
  19.     var divs = document.getElementsByTagName("div");   
  20.     var start = new Date().getTime();   
  21.     for(var i = 0, len = divs.length; i < len; i++){   
  22.         //"效率高"   
  23.     }   
  24.     var end = new Date().getTime();   
  25.     alert("用時:" + (end - start) + "毫秒");   

由上表可以看出,在IE6.0下,其差別是非常明顯,而在Firefox和Chrome下幾乎沒有差別,之所以在IE6.0下會有這種情況,主要是因為for循環(huán)在執(zhí)行中,第一種情況會每次都計算一下長度,而第二種情況卻是在開始的時候計算長度,并把其保存到一個變量中,所以其執(zhí)行效率要高點,所以在我們使用for循環(huán)的時候,特別是需要計算長度的情況,我們應(yīng)該開始將其保存到一個變量中。但是并不是只要是取長度都會出現(xiàn)如此明顯的差別,如果我們僅僅是操作一個數(shù)組,取得的是一個數(shù)組的長度,那么其實兩種方式的寫法都差不多,我們看下面的例子:

  1. <input type="button" value="效率低" onclick="func1()" />   
  2. <input type="button" value="效率高" onclick="func2()" />  
  1. var arr2 = [];   
  2. for(var i = 0; i < 10000; i++){   
  3.     arr2[i] = "<div>" + i + "</div>";   
  4. }   
  5. //效率低的   
  6. function func1(){   
  7.     var start = new Date().getTime();   
  8.     for(var i = 0; i < arr2.length; i++){   
  9.         //"效率低"   
  10.     }   
  11.     var end = new Date().getTime();   
  12.     alert("用時:" + (end - start) + "毫秒");   
  13. }   
  14. //效率高的   
  15. function func2(){   
  16.     var start = new Date().getTime();   
  17.     for(var i = 0, len = arr2.length; i < len; i++){   
  18.         //"效率高"   
  19.     }   
  20.     var end = new Date().getTime();   
  21.     alert("用時:" + (end - start) + "毫秒");   

從上表可以看出,如果僅僅是一個數(shù)組的話,我們看到其實兩種寫法都是差不多的,其實如果我們把循環(huán)再上調(diào)到100000次的話,也僅僅是差別幾毫秒而已,所以在數(shù)組的情況下,我認(rèn)為都是一樣的。對于for循環(huán)的優(yōu)化,也有人提出很多點,有人認(rèn)為用-=1,或者從大到小的方式循環(huán)等等,我認(rèn)為是完全沒有必要的,這些優(yōu)化往往實際情況下根本沒有表現(xiàn)出來,換句話說只是計算機(jī)級別的微小的變化,但是給我們帶來的卻是代碼的可讀性大大的降低,所以實在是得不償失。

#p#

3、減少頁面的重繪

減少頁面重繪雖然本質(zhì)不是JS本身的優(yōu)化,但是其往往是由JS引起的,而重繪的情況往往是嚴(yán)重影響頁面性能的,所以完全有必要拿出來,我們看下面例子:

  1. <div id="demo"></div>   
  2. <input type="button" value="效率低" onclick="func1()" />   
  3. <input type="button" value="效率高" onclick="func2()" /> 
  1. var str = "<div>這是一個測試字符串</div><div>這是一個測試字符串</div><div>這是一個測試字符串</div><div>這是一個測試字符串</div><div>這是一個測試字符串</div><div>這是一個測試字符串</div><div>這是一個測試字符串</div><div>這是一個測試字符串</div><div>這是一個測試字符串</div><div>這是一個測試字符串</div><div>這是一個測試字符串</div><div>這是一個測試字符串</div><div>這是一個測試字符串</div>";   
  2. //效率低的   
  3. function func1(){   
  4.     var obj = document.getElementById("demo");   
  5.     var start = new Date().getTime();   
  6.     for(var i = 0; i < 100; i++){   
  7.         obj.innerHTML += str + i;   
  8.     }   
  9.     var end = new Date().getTime();   
  10.     alert("用時 " + (end - start) + " 毫秒");   
  11. }   
  12. //效率高的   
  13. function func2(){   
  14.     var obj = document.getElementById("demo");   
  15.     var start = new Date().getTime();   
  16.     var arr = [];   
  17.     for(var i = 0; i < 100; i++){   
  18.         arr[i] = str + i;   
  19.     }   
  20.     obj.innerHTML = arr.join("");   
  21.     var end = new Date().getTime();   
  22.     alert("用時 " + (end - start) + " 毫秒");   

在例子中,我只是用了100次的循環(huán),因為如果用10000次循環(huán)的話,瀏覽器基本上就卡住不動了,但是即使是100次的循環(huán),我們看看下面的執(zhí)行結(jié)果。

可以看到的是,這簡直是一個驚人的結(jié)果,僅僅100次的循環(huán),不管是在什么瀏覽器下,都出現(xiàn)了如此之大的差別,另外我們還發(fā)現(xiàn),在這里,IE6的執(zhí)行效率居然比起Firefox還要好很多,可見Firefox在頁面重繪這方面并沒有做一些的優(yōu)化。這里還要注意的是,一般影響頁面重繪的不僅僅是innerHTML,如果改變元素的樣式,位置等情況都會觸發(fā)頁面重繪,所以在平時一定要注意這點。

#p#

4、減少作用域鏈上的查找次數(shù)

我們知道,js代碼在執(zhí)行的時候,如果需要訪問一個變量或者一個函數(shù)的時候,它需要遍歷當(dāng)前執(zhí)行環(huán)境的作用域鏈,而遍歷是從這個作用域鏈的前端一級一級的向后遍歷,直到全局執(zhí)行環(huán)境,所以這里往往會出現(xiàn)一個情況,那就是如果我們需要經(jīng)常訪問全局環(huán)境的變量對象的時候,我們每次都必須在當(dāng)前作用域鏈上一級一級的遍歷,這顯然是比較耗時的,我們看下面的例子:

  1. <div id="demo"></div>   
  2. <input id="but1" type="button" onclick="func1()" value="效率低"/>   
  3. <input id="but2" type="button" onclick="func2()" value="效率高"/>   
  4.  
  1. function func1(){   
  2.     var start = new Date().getTime();   
  3.     for(var i = 0; i < 10000; i++){   
  4.         var but1 = document.getElementById("but1");   
  5.         var but2 = document.getElementById("but2");   
  6.         var inputs = document.getElementsByTagName("input");   
  7.         var divs = document.getElementsByTagName("div");   
  8.         var but1 = document.getElementById("but1");   
  9.         var but2 = document.getElementById("but2");   
  10.         var inputs = document.getElementsByTagName("input");   
  11.         var divs = document.getElementsByTagName("div");   
  12.         var but1 = document.getElementById("but1");   
  13.         var but2 = document.getElementById("but2");   
  14.         var inputs = document.getElementsByTagName("input");   
  15.         var divs = document.getElementsByTagName("div");   
  16.         var but1 = document.getElementById("but1");   
  17.         var but2 = document.getElementById("but2");   
  18.         var inputs = document.getElementsByTagName("input");   
  19.         var divs = document.getElementsByTagName("div");   
  20.         var but1 = document.getElementById("but1");   
  21.         var but2 = document.getElementById("but2");   
  22.         var inputs = document.getElementsByTagName("input");   
  23.         var divs = document.getElementsByTagName("div");   
  24.         var but1 = document.getElementById("but1");   
  25.         var but2 = document.getElementById("but2");   
  26.         var inputs = document.getElementsByTagName("input");   
  27.         var divs = document.getElementsByTagName("div");   
  28.     }   
  29.     var end = new Date().getTime();   
  30.     alert("用時 " + (end - start) + " 毫秒");   
  31. }   
  32. function func2(){   
  33.     var start = new Date().getTime();   
  34.     var doc = document;   
  35.     for(var i = 0; i < 10000; i++){   
  36.         var but1 = doc.getElementById("but1");   
  37.         var but2 = doc.getElementById("but2");   
  38.         var inputs = doc.getElementsByTagName("input");   
  39.         var divs = doc.getElementsByTagName("div");   
  40.         var but1 = doc.getElementById("but1");   
  41.         var but2 = doc.getElementById("but2");   
  42.         var inputs = doc.getElementsByTagName("input");   
  43.         var divs = doc.getElementsByTagName("div");   
  44.         var but1 = doc.getElementById("but1");   
  45.         var but2 = doc.getElementById("but2");   
  46.         var inputs = doc.getElementsByTagName("input");   
  47.         var divs = doc.getElementsByTagName("div");   
  48.         var but1 = doc.getElementById("but1");   
  49.         var but2 = doc.getElementById("but2");   
  50.         var inputs = doc.getElementsByTagName("input");   
  51.         var divs = doc.getElementsByTagName("div");   
  52.         var but1 = doc.getElementById("but1");   
  53.         var but2 = doc.getElementById("but2");   
  54.         var inputs = doc.getElementsByTagName("input");   
  55.         var divs = doc.getElementsByTagName("div");   
  56.         var but1 = doc.getElementById("but1");   
  57.         var but2 = doc.getElementById("but2");   
  58.         var inputs = doc.getElementsByTagName("input");   
  59.         var divs = doc.getElementsByTagName("div");   
  60.     }   
  61.     var end = new Date().getTime();   
  62.     alert("用時 " + (end - start) + " 毫秒");   

上面代碼中,第二種情況是先把全局對象的變量放到函數(shù)里面先保存下來,然后直接訪問這個變量,而第一種情況是每次都遍歷作用域鏈,直到全局環(huán)境,我們看到第二種情況實際上只遍歷了一次,而第一種情況卻是每次都遍歷了,所以我們看看其執(zhí)行結(jié)果:

從上表中可以看出,其在IE6下差別還是非常明顯的,而且這種差別在多級作用域鏈和多個全局變量的情況下還會表現(xiàn)的非常明顯。

#p#

5、避免雙重解釋

雙重解釋的情況也是我們經(jīng)常會碰到的,有的時候我們沒怎么考慮到這種情況會影響到效率,雙重解釋一般在我們使用eval、new Function和setTimeout等情況下會遇到,我們看看下面的例子:

  1. <div id="demo"></div>   
  2. <input id="but1" type="button" onclick="func1()" value="效率低"/>   
  3. <input id="but2" type="button" onclick="func2()" value="效率高"/>   
  1. var sum, num1 = 1, num2 = 2;   
  2. function func1(){   
  3.     var start = new Date().getTime();   
  4.     for(var i = 0; i < 10000; i++){   
  5.         var func = new Function("sum+=num1;num1+=num2;num2++;");   
  6.         func();   
  7.     }   
  8.     var end = new Date().getTime();   
  9.     alert("用時 " + (end - start) + " 毫秒");   
  10. }   
  11.     
  12. function func2(){   
  13.     var start = new Date().getTime();   
  14.     for(var i = 0; i < 10000; i++){   
  15.         sum+=num1;   
  16.         num1+=num2;   
  17.         num2++;   
  18.     }   
  19.     var end = new Date().getTime();   
  20.     alert("用時 " + (end - start) + " 毫秒");   

第一種情況我們是使用了new Function來進(jìn)行雙重解釋,而第二種是避免了雙重解釋,我們看看在不同瀏覽器下的表現(xiàn):

可以看到,在所有的瀏覽器中,雙重解釋都是有很大開銷的,所以在實際當(dāng)中要盡量避免雙重解釋。

感謝"SeaSunK"對第四點測試報告錯誤的指正,現(xiàn)在已經(jīng)修改過來了。至于最后一點提出的func1每次都初始化,沒有可比性,所以我給換了eval,結(jié)果發(fā)現(xiàn),在IE6.0下還是有影響,而且在Firefox下,使用eval對效率的影響程度更加厲害,在Firefox下,如果10000次循環(huán),需要十多秒的時間,所以我把循環(huán)都變成了1000次。看代碼和報告。

  1. var sum, num1 = 1, num2 = 2;   
  2. function func1(){   
  3.     var start = new Date().getTime();   
  4.     for(var i = 0; i < 1000; i++){   
  5.         eval("sum+=num1;num1+=num2;num2++;");   
  6.     }   
  7.     var end = new Date().getTime();   
  8.     alert("用時 " + (end - start) + " 毫秒");   
  9. }   
  10. function func2(){   
  11.     var start = new Date().getTime();   
  12.     for(var i = 0; i < 1000; i++){   
  13.         sum+=num1;   
  14.         num1+=num2;   
  15.         num2++;   
  16.     }   
  17.     var end = new Date().getTime();   
  18.     alert("用時 " + (end - start) + " 毫秒");   

 

原文鏈接:http://www.cnblogs.com/lookhan/archive/2012/06/14/2549639.html

【編輯推薦】

  1. Slider實現(xiàn)的滑動條效果
  2. JavaScript圖片變換效果(IE only)
  3. JavaScript提升網(wǎng)頁加載速度
  4. JavaScript馬賽克遮罩圖片幻燈片切換類
  5. 看JavaScript如何實現(xiàn)頁面自適
責(zé)任編輯:張偉 來源: 木草人的博客
相關(guān)推薦

2022-09-04 15:54:10

Node.jsAPI技巧

2022-09-04 15:40:39

JavaScrip狀態(tài)模式軟件

2022-06-21 07:41:08

FCPJS代碼

2022-08-15 18:22:22

JS代碼

2019-07-09 10:51:53

HTTPS優(yōu)化服務(wù)器

2021-04-27 06:44:03

PythonCython編程語言

2016-10-09 11:03:41

Javascript模塊化Web

2021-11-17 21:58:02

Python編程語言

2021-03-17 08:00:59

JS語言Javascript

2019-05-28 10:00:06

PHP代碼前端

2024-12-23 08:10:00

Python代碼性能代碼

2019-11-15 15:50:41

JS代碼React前端

2019-09-17 14:31:52

JSJavaScript前端

2018-03-30 10:02:08

代碼規(guī)范維護(hù)工程師

2017-06-28 16:18:22

編程程序員開發(fā)

2023-10-06 23:14:07

VLAN網(wǎng)絡(luò)性能

2020-05-13 14:15:25

if-else代碼前端

2024-12-05 14:06:29

JS代碼片段

2011-07-06 11:33:52

ADSLModem

2024-02-22 10:27:00

Python開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久精品一二三影院 | 日韩视频一区 | 欧美在线观看一区二区 | av天天爽| 午夜视频网 | 日韩a v在线免费观看 | 久久一区二区免费视频 | 天天色综 | 免费观看国产视频在线 | 国产一区二区久久久 | 国产成人精品久久久 | 欧美性受xxxx | 国产欧美一区二区三区在线看 | 亚洲一区二区三区在线 | 欧美一级三级 | 一级h片 | 精品麻豆剧传媒av国产九九九 | av黄色在线观看 | 99爱在线免费观看 | 超碰97人人人人人蜜桃 | 久久久久免费观看 | www.五月天婷婷 | 婷婷五月色综合香五月 | 午夜影视在线观看 | 精品国产乱码久久久久久闺蜜 | 久久国产精品精品国产色婷婷 | 日韩精品999 | 玖玖久久| 日韩电影一区 | 69av网| 国产ts人妖另类 | 午夜精品一区二区三区在线视频 | 日韩在线观看网站 | 天天操人人干 | 97人人澡人人爽91综合色 | 亚洲一区亚洲二区 | 日本成年免费网站 | 黄色国产在线播放 | 天天艹逼网 | 亚洲色欲色欲www | japanhd成人 |