JS優(yōu)化與惰性載入函數(shù)實例分析
本文實例講述了JS優(yōu)化與惰性載入函數(shù)。分享給大家供大家參考,具體如下:
惰性載入函數(shù)
由于現(xiàn)在瀏覽器之間的差異,為了實現(xiàn)跨瀏覽器工作,很多函數(shù)要書寫大量if語句或者try…catch…語句。當(dāng)每次調(diào)用函數(shù)時,都要對每個if分支或try語句進行檢查,這樣會使得瀏覽器反應(yīng)變慢。實際上,當(dāng)我們用某個瀏覽器打開網(wǎng)頁時,就決定了某個if分支或try語句是可用的,沒有必要每次調(diào)用都檢查。為了解決以上問題,JavaScript中出現(xiàn)一種名為惰性載入的技巧。
惰性載入表示函數(shù)執(zhí)行的分支僅會發(fā)生一次。有兩種實現(xiàn)惰性載入的方式:在函數(shù)被調(diào)用時再處理函數(shù);在聲明函數(shù)時就指定適當(dāng)函數(shù)。
借用JavaScript高級程序設(shè)計中的例子來說明這兩種解決方案。
創(chuàng)建XHR對象的兼容寫法如下:
function createXHR(){
if (typeof XMLHttpRequest != "undefined"){
return new XMLHttpRequest();
} else if (typeof ActiveXObject != "undefined"){
if (typeof arguments.callee.activeXString != "string"){
var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0",
"MSXML2.XMLHttp"];
for (var i=0,len=versions.length; i < len; i++){
try {
var xhr = new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
return xhr;
} catch (ex){
//skip
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
} else {
throw new Error("No XHR object available.");
}
}
使用惰性載入的第一種方法——在函數(shù)被調(diào)用時再處理函數(shù):
function createXHR(){
if(typeof XMLHttpRequest!="undefined"){
createXHR=function(){
return new XMLHttpRequest();
};
}else if(typeof ActiveXObject!="undefined"){
createXHR=function(){
if(typeof arguments.callee.activeXString!="string"){
var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],
i,len;
for(i=0,len=versions.length;i<len;i++){
try{
new ActiveXObject(versions[i]);
arguments.callee.activeXString=versions[i];
break;
}catch(ex){
//skip
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
};
}else{
createXHR=function(){
throw new Error("No XHR object available.");
};
}
return CreateXHR();
}
使用惰性載入的第二種方法——在聲明函數(shù)時就指定適當(dāng)函數(shù):
var createXHR=(function(){
if(typeof XMLHttpRequest!="undefined"){
return function(){
return new XMLHttpRequest();
};
}else if(typeof ActiveXObject!="undefined"){
return function(){
if(typeof arguments.callee.activeXString!="string"){
var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],
i,len;
for(i=0,len=versions.length;i<len;i++){
try{
new ActiveXObject(versions[i]);
arguments.callee.activeXString=versions[i];
break;
}catch(ex){
//skip
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
};
}else{
return function(){
throw new Error("No XHR object available.");
};
}
})();
上例中,使用的是一個匿名、自執(zhí)行的函數(shù),用以確定應(yīng)該使用哪個函數(shù)。
以上兩種使用惰性載入函數(shù)的共同優(yōu)點是,只在第一次執(zhí)行函數(shù)時犧牲部分性能,可以提高代碼效率。
更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript中json操作技巧總結(jié)》、《JavaScript切換特效與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》、《JavaScript動畫特效與技巧匯總》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運算用法總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
相關(guān)文章
wangEditor編輯器失去焦點后仍然可以在原位置插入圖片分析
本文給大家?guī)淼氖且豢罘浅2诲e的富文本編輯器WangEditor,他最大的特點是它在ie6,7,8上都可以做到失去焦點后仍然可以在原位置插入圖片,而且代碼量很少,下面我們就來分析下他是如何實現(xiàn)的呢2015-05-05
JavaScript EasyPager 分頁函數(shù)
好久不寫js,手都有點生了。寫個小東西熱手。2011-05-05
JavaScript語法 JSON序列化之stringify實例詳解
這篇文章主要為大家介紹了JavaScript語法 JSON序列化之stringify實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10

