在JS中有些內存只需執行一遍即可,如浏覽器類型檢測是最常用的一個功能,因為我們使用Ajax的時候需要檢測浏覽器的內置的XHR。我們可以在第一次檢測的時候記錄下類型,往後在使用Ajax的時候就不需要再去檢測浏覽器類型了。在JS中就算只有一個if也總比沒有if的語句效率要高。
普通Ajax方法
復制代碼 代碼如下:
/**
* JS惰性函數
*/
function ajax(){
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,k=version.length;i<k;i++){
try{
new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
break;
}catch(ex){
throw ex;
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}else{
throw "No XHR object";
}
}
每次調用ajax()函數都要對浏覽器內置的XHR檢查,效率不高。
使用惰性方式的方法
復制代碼 代碼如下:
/**
* JS惰性函數
*/
function ajax(){
if(typeof XMLHttpRequest != "undefined"){
ajax = function(){
return new XMLHttpRequest();
};
}else if(typeof ActiveXObject != "undefined"){
ajax = function(){
if(typeof arguments.callee.activeXString != "string"){
var versions = ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"];
for(var i=0,k=version.length;i<k;i++){
try{
var xhr = new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
return xhr;
}catch(ex){
throw ex;
}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}
}else{
ajax = function(){
throw "No XHR object";
}
}
return ajax();
}
在第二個惰性方法中if的每個分支都會為ajax()變量賦值,有效覆蓋了原有函數,最後一步調用新的函數。下一次調用的ajax()的時候,就直接調用變量。
優化重點
要執行特定代碼只有實際調用才執行,而某些JS庫一開始就檢測浏覽器,預先設置好。
由於加了復雜的判斷所以首次運行速度慢,但後邊的多冊運行的效率會更快。
有時候寫代碼久了,不能一成不變,要經常思考怎樣才能使程序運行的更快,更有效率。這樣的思考下寫出來的程序才是精裝,而不會產生多余的垃圾代碼。這也不是簡單OO就能一刀切,實際上代碼很多地方都是活的,人更是活的。