日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
如何優(yōu)化你的JS代碼

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

公司主營(yíng)業(yè)務(wù):做網(wǎng)站、成都網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。成都創(chuàng)新互聯(lián)公司推出鐵西免費(fèi)做網(wǎng)站回饋大家。

1、字符串的拼接

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

 
 
 
 
   
  •    
  •  
  •  
     
     
     
    1. //效率低的   
    2. function func1(){   
    3.     var start = new Date().getTime();   
    4.     var template = "";   
    5.     for(var i = 0; i < 10000; i++){   
    6.         template += "";   
    7.     }   
    8.     var end = new Date().getTime();   
    9.     document.getElementById("one").innerHTML = template;   
    10.     alert("用時(shí):" + (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] = "";   
    18.     }   
    19.     var end = new Date().getTime();   
    20.     document.getElementById("one").innerHTML = array.join("");   
    21.     alert("用時(shí):" + (end - start) + "毫秒");   
    22. }   

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

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

    #p#

    2、for循環(huán)

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

     
     
     
     
    1.    
    2.  
     
     
     
     
    1. var arr = [];   
    2. for(var i = 0; i < 10000; i++){   
    3.     arr[i] = "
      " + i + "
      ";   
    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("用時(shí):" + (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("用時(shí):" + (end - start) + "毫秒");   

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

     
     
     
     
    1.    
    2.   
     
     
     
     
    1. var arr2 = [];   
    2. for(var i = 0; i < 10000; i++){   
    3.     arr2[i] = "
      " + i + "
      ";   
    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("用時(shí):" + (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("用時(shí):" + (end - start) + "毫秒");   

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

    #p#

    3、減少頁(yè)面的重繪

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

     
     
     
     
       
  •    
  •  
  •  
     
     
     
    1. var str = "
      這是一個(gè)測(cè)試字符串
      這是一個(gè)測(cè)試字符串
      這是一個(gè)測(cè)試字符串
      這是一個(gè)測(cè)試字符串
      這是一個(gè)測(cè)試字符串
      這是一個(gè)測(cè)試字符串
      這是一個(gè)測(cè)試字符串
      這是一個(gè)測(cè)試字符串
      這是一個(gè)測(cè)試字符串
      這是一個(gè)測(cè)試字符串
      這是一個(gè)測(cè)試字符串
      這是一個(gè)測(cè)試字符串
      這是一個(gè)測(cè)試字符串
      ";   
    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("用時(shí) " + (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("用時(shí) " + (end - start) + " 毫秒");   

    在例子中,我只是用了100次的循環(huán),因?yàn)槿绻?0000次循環(huán)的話,瀏覽器基本上就卡住不動(dòng)了,但是即使是100次的循環(huán),我們看看下面的執(zhí)行結(jié)果。

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

    #p#

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

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

     
     
     
     
       
  •    
  •    
  •  
  •  
     
     
     
    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("用時(shí) " + (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("用時(shí) " + (end - start) + " 毫秒");   

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

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

    #p#

    5、避免雙重解釋

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

     
     
     
     
       
  •    
  •    
  •  
     
     
     
    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("用時(shí) " + (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("用時(shí) " + (end - start) + " 毫秒");   

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

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

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

     
     
     
     
    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("用時(shí) " + (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("用時(shí) " + (end - start) + " 毫秒");   

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

    【編輯推薦】

    1. Slider實(shí)現(xiàn)的滑動(dòng)條效果
    2. JavaScript圖片變換效果(IE only)
    3. JavaScript提升網(wǎng)頁(yè)加載速度
    4. JavaScript馬賽克遮罩圖片幻燈片切換類
    5. 看JavaScript如何實(shí)現(xiàn)頁(yè)面自適

    新聞標(biāo)題:如何優(yōu)化你的JS代碼
    轉(zhuǎn)載注明:http://m.5511xx.com/article/cojseeo.html