欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript 總結(jié)幾個(gè)提高性能知識(shí)點(diǎn)(推薦)

 更新時(shí)間:2017年02月20日 09:47:42   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇JavaScript 總結(jié)幾個(gè)提高性能知識(shí)點(diǎn)(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

前段時(shí)間花時(shí)間看了大半的《High Performance JavaScript》這本書(shū)啊,然后就開(kāi)始忙項(xiàng)目了,慶幸最忙的一周已經(jīng)熬過(guò)去了。由于空不出時(shí)間,這個(gè)月寫(xiě)的學(xué)習(xí)筆記也不多,忙完最苦X的一周,這兩天晚上也算是挑燈夜讀了...終于是在殘血之際將這本書(shū)shut down了...

既然讀完了,總歸是要學(xué)到些什么的。說(shuō)說(shuō)對(duì)這本書(shū)的看法先吧,整體的來(lái)說(shuō),內(nèi)容還是不錯(cuò)的,就是感覺(jué)有點(diǎn)老了(作為前端小白,也可能是自身水平有限,未能體會(huì)到其中真意)??催@本書(shū)的過(guò)程中也是寫(xiě)了挺多代碼用以測(cè)試的,并且對(duì)本書(shū)提倡的寫(xiě)法和原先大眾的寫(xiě)法的執(zhí)行分別進(jìn)行了斷點(diǎn)跟蹤,對(duì)于能實(shí)際測(cè)出的問(wèn)題進(jìn)行理解,當(dāng)然,下斷點(diǎn)跟著執(zhí)行也看不出的那也沒(méi)辦法咯。對(duì)于書(shū)中的知識(shí)點(diǎn),這里只是簡(jiǎn)單的整理出個(gè)人所推崇的一部分,當(dāng)然~ 不喜勿噴。

針對(duì)js文件的加載位置

在HTML文件中,<script>標(biāo)簽是可以加在<head>區(qū)域和<body>區(qū)域的。這里鑒于JavaScript執(zhí)行和UI渲染的單線(xiàn)程原因,如果js文件載入會(huì)阻塞后面對(duì)于頁(yè)面的解析過(guò)程,頁(yè)面會(huì)等到j(luò)s文件完全加載并運(yùn)行后才繼續(xù)執(zhí)行該做的操作。那么問(wèn)題就來(lái)了,這樣可能會(huì)出現(xiàn)頁(yè)面空白o(hù)r卡頓現(xiàn)象。作為一名前端開(kāi)發(fā),重要的不僅僅止于實(shí)現(xiàn)了需求,應(yīng)該還有優(yōu)質(zhì)的用戶(hù)體驗(yàn)。那么我們就需要消除用戶(hù)枯燥的等待,針對(duì)這個(gè)問(wèn)題,這里有本獸想到的兩種解決方案:

1.  如果js文件沒(méi)有特殊要求指明需要在頁(yè)面渲染之前載入及編譯完成的,那么選擇將js文件放到</body>標(biāo)簽前(既所有的頁(yè)面所呈現(xiàn)內(nèi)容的后面),css文件還是放到<head>區(qū)域(誰(shuí)也不愿意看一個(gè)布局雜亂無(wú)章的頁(yè)面)。這樣做就能先讓用戶(hù)看到有布局的頁(yè)面而不是空白頁(yè)了,那么也會(huì)有人指出:那數(shù)據(jù)得通過(guò)js請(qǐng)求加載進(jìn)來(lái)啊,怎么辦呢?可以對(duì)數(shù)據(jù)的加載做排序,急需呈現(xiàn)的接口放前面執(zhí)行,不是那么需要的可以延后執(zhí)行,同時(shí)做個(gè)簡(jiǎn)單的載入動(dòng)畫(huà)or提示。

2.  如果這些js文件有指明需要先執(zhí)行了,才能更好的展示頁(yè)面內(nèi)容,那么就在第一個(gè)js或者頁(yè)面上先放個(gè)載入小動(dòng)畫(huà),可以一些有趣的或者萌萌的動(dòng)畫(huà)場(chǎng)景。這樣也是能較好的避免用戶(hù)等待的無(wú)聊,說(shuō)不定人家還對(duì)這個(gè)載入動(dòng)畫(huà)更感興趣呢,這樣可提升項(xiàng)目的用戶(hù)體驗(yàn)感。

最終推薦:將<script>標(biāo)簽盡可能的放到</body>標(biāo)簽前面加載,以提升用戶(hù)體驗(yàn)。

針對(duì)js文件的合并

在很多團(tuán)隊(duì)開(kāi)發(fā)中,我們可能會(huì)將不同功能的代碼塊分別放置在不同的js文件中,以便于開(kāi)發(fā)過(guò)程中眾人合作寫(xiě)代碼會(huì)更加方便,畢竟只需要找對(duì)應(yīng)文件夾或文件而不是在一個(gè)很長(zhǎng)的文件中找一個(gè)方法。這確實(shí)是會(huì)提高團(tuán)隊(duì)開(kāi)發(fā)效率及新人加入后的更容易進(jìn)行二次開(kāi)發(fā)及維護(hù)。那么將這個(gè)問(wèn)題放到頁(yè)面性能里呢?這正是問(wèn)題所在,在這本書(shū)中指出:Each HTTP request brings with it additional performance overhead,so downloading one single 100 KB file will be faster than downloading four 25 KB files.

下載1個(gè)100KB的文件比下載4個(gè)25KB的文件要快,而開(kāi)發(fā)過(guò)程中區(qū)分開(kāi)各個(gè)文件又有很大的好處,那么合并這個(gè)問(wèn)題也就放在開(kāi)發(fā)完后再處理咯,相信這個(gè)操作大家都不會(huì)陌生吧,現(xiàn)在的前端工具這么豐富,各位習(xí)慣用什么壓縮就用什么壓縮吧~

這里簡(jiǎn)單提出下,在載入文件方面還可以用到defer和async屬性,用于延遲加載和異步加載,在現(xiàn)代瀏覽器中,大多數(shù)是已經(jīng)支持defer屬性了,還沒(méi)習(xí)慣用這個(gè)額,也不知道具體會(huì)不會(huì)存在什么問(wèn)題。有興趣的朋友可自行g(shù)oogle該知識(shí)點(diǎn),這里件簡(jiǎn)單提下吧。

現(xiàn)在的框架也大多配合懶加載和按需加載了。

更快速的數(shù)據(jù)訪(fǎng)問(wèn)

對(duì)于瀏覽器來(lái)說(shuō),一個(gè)標(biāo)識(shí)符所處的位置越深,去讀寫(xiě)他的速度也就越慢(對(duì)于這點(diǎn),原型鏈亦是如此)。這個(gè)應(yīng)該不難理解,簡(jiǎn)單比喻就是:雜貨店離你家越遠(yuǎn),你去打醬油所花的時(shí)間就越長(zhǎng)... 熊孩子,打個(gè)醬油那么久,菜早燒焦了 -.-~

如果我們需要在當(dāng)前函數(shù)內(nèi)多次用到一個(gè)變量值,那么我們可以用一個(gè)局部變量先將其存儲(chǔ)起來(lái),案例如下:

//修改前
 function showLi(){
   var i = 0;
   for(;i<document.getElementsByTagName("li").length;i++){  //一次訪(fǎng)問(wèn)document
     console.log(i,document.getElementsByTagName("li")[i]); //三次訪(fǎng)問(wèn)document
   };
 };
 //修改后
 function showLi(){
   var li_s = document.getElementsByTagName("li"); //一次訪(fǎng)問(wèn)document
   var i = 0;
   for(;i<li_s.length;i++){
     console.log(i,li_s[i]); //三次訪(fǎng)問(wèn)局部變量li_s
   };
 };

DOM操作的優(yōu)化

眾所周知的,DOM操作遠(yuǎn)比javascript的執(zhí)行耗性能,雖然我們避免不了對(duì)DOM進(jìn)行操作,但我們可以盡量去減少該操作對(duì)性能的消耗。

讓我們通過(guò)代碼解釋這個(gè)問(wèn)題:

function innerLi_s(){
   var i = 0;
   for(;i<20;i++){
     document.getElementById("Num").innerHTML="A"; //進(jìn)行了20次循環(huán),每次又有2次DOM元素訪(fǎng)問(wèn):一次讀取innerHTML的值,一次寫(xiě)入值
   };
 };

針對(duì)以上方法進(jìn)行一次改寫(xiě):

function innerLi_s(){
   var content ="";
   var i = 0;
   for(;i<20;i++){
     content += "A"; //這里只對(duì)js的變量循環(huán)了20次
   };
   document.getElementById("Num").innerHTML += content; //這里值進(jìn)行了一次DOM操作,又分2次DOM訪(fǎng)問(wèn):一次讀取innerHTML的值,一次寫(xiě)入值
 };

減少Dom的重繪重排版

元素布局的改變或內(nèi)容的增刪改或者瀏覽器窗口尺寸改變都將會(huì)導(dǎo)致重排,而字體顏色或者背景色的修改則將導(dǎo)致重繪。

對(duì)于類(lèi)似以下代碼的操作,據(jù)說(shuō)現(xiàn)代瀏覽器大多進(jìn)行了優(yōu)化(將其優(yōu)化成1次重排版):

//修改前
 var el = document.getElementById("div");
 el.style.borderLeft = "1px"; //1次重排版
 el.style.borderRight = "2px"; //又1次重排版
 el.style.padding = "5px"; //還有1次重排版
 //修改后
 var el = document.getElementById("div");
 el.style.cssText = "border-left:1px;border-right:2px;padding:5px"; //1次重排版

針對(duì)多重操作,以下三種方法也可以減少重排版和重繪的次數(shù):

1.Dom先隱藏,操作后再顯示 2次重排 (臨時(shí)的display:none)

2.document.createDocumentFragment() 創(chuàng)建文檔片段處理,操作后追加到頁(yè)面 1次重排

3.var newDOM = oldDOM.cloneNode(true)創(chuàng)建Dom副本,修改副本后oldDOM.parentNode.replaceChild(newDOM,oldDOM)覆蓋原DOM 2次重排

循環(huán)的優(yōu)化

這應(yīng)該是較多人都知道的寫(xiě)法了,簡(jiǎn)單帶過(guò)即可(后面還是用代碼+注釋形式說(shuō)明)~

//修改前
 var i = 0;
 for(;i<arr.lengthli++){ //每次循環(huán)都需要獲取數(shù)組arr的length
   console.log(arr[i]);
 }
 //修改后
 var i = 0;
 var len = arr.length; //獲取一次數(shù)組arr的length 
 for(;i<len;i++){
   console.log(arr[i]);
 }
 //or
 var i = arr.length;;
 for(;i;i--){
   console.log(arr[i]);
 }
.odd{color:red}
.even{color:yellow}
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
</ul>
var i = 0;
 var lis = document.getElementsByTagName("li");
 var len = lis.length;
 for(;i<len;i++){
   if(i&1){
     lis[i].className = "even";
   } else{
     lis[i].className = "odd";
   }
 };

以上這篇JavaScript 總結(jié)幾個(gè)提高性能知識(shí)點(diǎn)(推薦)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • ES6擴(kuò)展運(yùn)算符的用途實(shí)例詳解

    ES6擴(kuò)展運(yùn)算符的用途實(shí)例詳解

    這篇文章主要介紹了ES6擴(kuò)展運(yùn)算符的用途 ,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-08-08
  • 微信小程序?qū)崿F(xiàn)短信登錄的實(shí)戰(zhàn)

    微信小程序?qū)崿F(xiàn)短信登錄的實(shí)戰(zhàn)

    項(xiàng)目要求增加短信登錄及人臉識(shí)別登錄功能,本文就來(lái)實(shí)現(xiàn)一下 短信登錄功能,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 解決小程序無(wú)法觸發(fā)SESSION問(wèn)題

    解決小程序無(wú)法觸發(fā)SESSION問(wèn)題

    這篇文章主要介紹了解決小程序無(wú)法觸發(fā)SESSION問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • js利用appendChild對(duì)<li>標(biāo)簽進(jìn)行排序的實(shí)現(xiàn)方法

    js利用appendChild對(duì)<li>標(biāo)簽進(jìn)行排序的實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇js利用appendChild對(duì)<li>標(biāo)簽進(jìn)行排序的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • JS如何在不同平臺(tái)實(shí)現(xiàn)多語(yǔ)言方式

    JS如何在不同平臺(tái)實(shí)現(xiàn)多語(yǔ)言方式

    這篇文章主要介紹了JS如何在不同平臺(tái)實(shí)現(xiàn)多語(yǔ)言方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • JavaScript仿京東實(shí)現(xiàn)秒殺倒計(jì)時(shí)案例詳解

    JavaScript仿京東實(shí)現(xiàn)秒殺倒計(jì)時(shí)案例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript實(shí)現(xiàn)京東秒殺倒計(jì)時(shí)效果,文中示例代碼介紹的非常詳細(xì),感興趣的小伙伴們可以參考一下
    2022-03-03
  • uniapp上傳二進(jìn)制圖片的實(shí)現(xiàn)

    uniapp上傳二進(jìn)制圖片的實(shí)現(xiàn)

    本文主要介紹了uniapp上傳二進(jìn)制圖片的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • javascript數(shù)組中的reduce方法和pop方法

    javascript數(shù)組中的reduce方法和pop方法

    這篇文章主要介紹了javascript數(shù)組中的reduce方法和pop方法,文章內(nèi)容介紹詳細(xì),具有一定的參考價(jià)值需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-03-03
  • javascript獲取select標(biāo)簽選中的值

    javascript獲取select標(biāo)簽選中的值

    這篇文章主要介紹javascript獲取select標(biāo)簽選中的值方法,比較實(shí)用,需要的朋友可以參考下。
    2016-06-06
  • JS表單驗(yàn)證的代碼(常用)

    JS表單驗(yàn)證的代碼(常用)

    最近沒(méi)有項(xiàng)目做,有點(diǎn)空余時(shí)間,小編把日常比較常用的js表單驗(yàn)證代碼整理分享到腳本之家平臺(tái),供大家學(xué)習(xí),需要的朋友參考下吧
    2016-04-04

最新評(píng)論