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

JavaScript提高網(wǎng)站性能優(yōu)化的建議(二)

 更新時間:2016年07月24日 09:56:27   作者:vicfeel  
這篇文章主要介紹了JavaScript提高網(wǎng)站性能優(yōu)化的建議(二)的相關(guān)資料,需要的朋友可以參考下

javascript關(guān)于提高網(wǎng)站性能的幾點建議(一)中,從HTTP請求到頁面渲染幾個方面對提高網(wǎng)站性能提出了幾點建議,本文是學(xué)習(xí)Steve Sounders的另外一本書《高性能網(wǎng)站建設(shè)進階指南》之后,從JavaScript性能的角度進行總結(jié)概括,諸君共勉。

JavaScript性能是實現(xiàn)高性能Web應(yīng)用程序的關(guān)鍵

——Steve Sounders

1 利用js作用域鏈

作用域鏈(scope chain)

當(dāng)執(zhí)行一段JavaScript代碼(全局代碼或函數(shù))時,JavaScript引擎會創(chuàng)建為其創(chuàng)建一個作用域又稱為執(zhí)行上下文(Execution Context),在頁面加載后會首先創(chuàng)建一個全局的作用域,然后每執(zhí)行一個函數(shù),會建立一個對應(yīng)的作用域,從而形成了一條作用域鏈。每個作用域都有一條對應(yīng)的作用域鏈,鏈頭是全局作用域,鏈尾是當(dāng)前函數(shù)作用域。

作用域鏈的作用是用于解析標(biāo)識符,當(dāng)函數(shù)被創(chuàng)建時(不是執(zhí)行),會將this、arguments、命名參數(shù)和該函數(shù)中的所有局部變量添加到該當(dāng)前作用域中,當(dāng)JavaScript需要查找變量X的時候(這個過程稱為變量解析),它首先會從作用域鏈中的鏈尾也就是當(dāng)前作用域進行查找是否有X屬性,如果沒有找到就順著作用域鏈繼續(xù)查找,直到查找到鏈頭,也就是全局作用域鏈,仍未找到該變量的話,就認為這段代碼的作用域鏈上不存在x變量,并拋出一個引用錯誤(ReferenceError)的異常。

管理好作用域鏈的深度,是一種只要少量工作就能提高性能的簡易方法,我們應(yīng)避免因無意中增長了作用域鏈而導(dǎo)致執(zhí)行速度變得緩慢。

使用局部變量(盡量縮短作用域鏈)

如果理解了作用域鏈的概念,那么我們應(yīng)該清楚JavaScript引擎對變量的解析時間跟作用域鏈的深度有關(guān),顯而易見,局部變量由于處于鏈尾,存取速度是最快的,因此,一個好的經(jīng)驗是:任何非局部變量使用超過一次時,請使用局部變量將其存儲下來,例如:

function changeDiv(){
document.getELementById('myDiv').className = 'changed';
document.getELementById('myDiv').style.height = 150;
}

這里myDiv這個dom元素被引用了兩次,為了更快的引用,我們應(yīng)該用一個局部變量將其存儲下來,這樣做的好處不僅縮短了作用域鏈,而且避免了DOM元素的重復(fù)查詢:

function changeDiv(){
var myDivStyle = document.getElementById('myDiv').style;
myDiv.className = 300;
myDiv.style.height = 150;
}

避免使用with(不要增長作用域鏈)

一般在代碼執(zhí)行過程中,函數(shù)的作用域鏈?zhǔn)枪潭ǖ?,然而with可以臨時增長函數(shù)的作用域鏈。with用于將對象屬性作為局部變量來顯示,使其便于訪問,例如:

var user = {
name:'vicfeel',
age:'23'
};
function showUser(){
var local = 0;
with(user){
console.log("姓名" + name);
console.log("年齡" + age);
console.log(local);
}
}
showUser();

這個例子中,通過with在showUser作用域鏈的鏈尾中又增加了一個臨時作用域,該作用域存儲著user對象的所有屬性,也就是增長了with這段代碼的作用域鏈,在這段代碼中,局部變量像local從鏈尾的第一個對象變成了第二個,自然減慢了標(biāo)識符的存取。直到with語句結(jié)束,作用域鏈恢復(fù)增長。正因為with的這個缺陷,我們應(yīng)盡量避免使用with關(guān)鍵字。

2 更合理的流控制

JavaScript與其它編程語言一樣,擁有一些流控制語句(循環(huán)、條件等),在每個環(huán)節(jié)上使用恰當(dāng)?shù)恼Z句能極大的提高腳本的運行速度。

快速條件判斷

提到條件判斷,首先要避免的一種使用方式:

if(value == 0){
return result0;
}
else if(value == 1){
return result1;
}
else if(value == 2){
return result2;
}
else if(value == 3){
return result3;
}
else if(value == 4){
return result4;
}
else if(value == 5){
return result5;
}
else if(value == 6){
return result6;
}
else{
return result7;
}

這種使用if進行條件判斷的方式存在的主要問題是層次太深,當(dāng)我要value = 7時,消耗時間要比value = 0長很多,大大損耗了性能,同時可讀性很差。

一種更好的方式,利用switch進行判斷。

swithc(value){
case 0:
return result0;
case 1:
return result1;
case 2:
return result2;
case 3:
return result3;
case 4:
return result4;
case 5:
return result5;
case 6:
return result6;
default:
return result7;
}

這樣不僅提高了可讀性,查詢時間也要比if更快。但是如果只有一兩個條件時,if是比switch更快的

在JavaScript中,條件查詢還有另外一種方式,之前的例子是根據(jù)值返回不同的值,剛好可以利用數(shù)組實現(xiàn)hash表的映射查詢。

//定義數(shù)組
var results = [result0,result1,result2,result3,result4,result5,result6,result7];
//查詢結(jié)果
return results[value];

這種數(shù)組的方式,在查詢范圍很大時才更加有效,因為它不必檢測上下邊界,只需要填入索引值就可以查詢了。它的局限性在于條件對應(yīng)的是單一值,而不是一系列操作。因此要綜合實際情況,選擇合適的條件判斷方式,發(fā)揮性能最大化。

快速循環(huán)

JavaScript中存在4種循環(huán)方式for循環(huán)、do-while循環(huán)、while循環(huán)和for-in循環(huán)。下面是一個很常用的循環(huán)使用方式:

var values = [1,2,3,4,5];
for(var i = 0;i < values.length;i++){
process(values[i]);
}

我們可以看到,這段代碼最明顯可以優(yōu)化的地方在于values.length,每次循環(huán)i都要和values的長度進行比較,而查詢屬性要比局部變量更耗時,如果循環(huán)次數(shù)越大,這種耗時就越明顯,因此可以這樣優(yōu)化:

var values = [1,2,3,4,5];
var length = values.length;//局部變量存儲數(shù)組長度
for(var i = 0;i < length;i++){
process(values[i]);
}

這段代碼還可以繼續(xù)優(yōu)化,將循環(huán)變量遞減到0,而不是遞加到總長度。

var values = [1,2,3,4,5];
var length = values.length;
for(var i = length;i--;){ //遞減到0
process(values[i]);
}

這里將循環(huán)結(jié)束改造為與0比較,所以每個循環(huán)的速度更快了,根據(jù)循環(huán)的復(fù)雜度不同,這種簡單改變可以比原來節(jié)約大概50%的時間。

相關(guān)文章

  • 利用JavaScript實現(xiàn)簡單3D開關(guān)書本模型

    利用JavaScript實現(xiàn)簡單3D開關(guān)書本模型

    這篇文章主要為大家詳細介紹了如何利用JavaScript實現(xiàn)簡單3D開關(guān)書本模型的效果,文中的實現(xiàn)代碼講解的非常詳細,具有一定參考價值,感興趣的同學(xué)可以動手嘗試一下
    2023-11-11
  • bootstrap如何讓dropdown menu按鈕式下拉框長度一致

    bootstrap如何讓dropdown menu按鈕式下拉框長度一致

    bootstrap框架提供了下拉菜單組件(dropdown),即點擊一個元素或按鈕,觸發(fā)隱藏的列表顯示出來。下面通過本文給大家介紹bootstrap如何讓dropdown menu按鈕式下拉框長度一致,需要的朋友可以參考下
    2017-04-04
  • 妙用Bootstrap的 popover插件實現(xiàn)校驗表單提示功能

    妙用Bootstrap的 popover插件實現(xiàn)校驗表單提示功能

    最近使用bootstrap開發(fā)項目比較多,在表單校驗功能中用popover插件實現(xiàn)出錯提示功能很方面,下面小編給大家?guī)砹艘黄P(guān)于Bootstrap的 popover插件實現(xiàn)校驗表單提示功能的實現(xiàn)代碼,非常不錯,感興趣的朋友一起看看吧
    2016-08-08
  • Javascript監(jiān)視變量變化的方法

    Javascript監(jiān)視變量變化的方法

    這篇文章主要介紹了Javascript監(jiān)視變量變化的方法,涉及javascript針對變量的相關(guān)操作技巧,需要的朋友可以參考下
    2015-06-06
  • js冒泡、捕獲事件及阻止冒泡方法詳細總結(jié)

    js冒泡、捕獲事件及阻止冒泡方法詳細總結(jié)

    javascript, jquery的事件中都存在事件冒泡和事件捕獲的問題,針對這兩個問題,本文給出詳細的解決方法,需要的朋友不要錯過
    2014-05-05
  • js原生appendChild的bug解決心得分享

    js原生appendChild的bug解決心得分享

    appendChild主要是用來追加節(jié)點插入到最后;循環(huán)的時候由于不停的搬家導(dǎo)致length 在改變,改用for的話開始的length已經(jīng)被固定,問題就解決啦
    2013-07-07
  • 一個js實現(xiàn)的所謂的滑動門

    一個js實現(xiàn)的所謂的滑動門

    一個js實現(xiàn)的所謂的滑動門...
    2007-05-05
  • JavaScript實現(xiàn)無限級遞歸樹的示例代碼

    JavaScript實現(xiàn)無限級遞歸樹的示例代碼

    這篇文章主要介紹了JavaScript實現(xiàn)無限級遞歸樹的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • js 概率計算(簡單版)

    js 概率計算(簡單版)

    這篇文章主要介紹了js 概率計算(簡單版),需要的朋友可以參考下
    2017-09-09
  • 詳解datagrid使用方法(重要)

    詳解datagrid使用方法(重要)

    這篇文章主要介紹了datagrid使用方法(重要),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11

最新評論