有時候我們寫的一段代碼,用分支控制語句來決定程序的走向,有時候當運行環境一定的時候,if else 語句就是固定走某一個分支,這樣一來,其他不會運行的分支就被浪費了,下面舉個例子:
function getXhr(){
var xhr;
if("XMLHttpRequest" in window){
xhr=new XMLHttpRequest();
}else if("ActiveXObject" in window) {
if(arguments.callee.activeXStr!=="String"){
var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"], i,length;
try{
for(i=0;lenth=versions.length;i++){
new ActiveXObject(versions[i]);
arguments.callee.activeXStr=version[i];
break;
}
}catch(err){
}
}
xhr=new ActiveXObject(versions[i]);
}else{
throw("No available XHR");
}
return xhr;
}
這是一段聲明xhr對象的過程,很顯然,每次運行這段程序,總是要跑遍每一個分支,但是當在特定的環境中運行時,就會有一部分累贅的代碼出現了。這裏有2種改進方法。
1.在程序第一次運行時修改function
function getXhr(){
if("XMLHttpRequest" in window){
getXhr=function(){
return new XMLHttpRequest();
}
}else if("ActiveXObject" in window) {
getXhr=function(){
if(arguments.callee.activeXStr!=="String"){
var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"], i,length;
try{
for(i=0;lenth=versions.length;i++){
new ActiveXObject(versions[i]);
arguments.callee.activeXStr=version[i];
break;
}
}catch(err){
}
}
return new ActiveXObject(versions[i]);
}
}else{
getXhr=function(){
throw("No available XHR");
}
}
return getXhr();
}
這樣在這個函數在被第一次調用的時候,就會將getXhr確定下來,最後會返回對應那個分支的函數執行結果。
2.在程序第一次加載時確定function
var getXhr=(function(){
if("XMLHttpRequest" in window){
return function(){
return new XMLHttpRequest();
}
}else if("ActiveXObject" in window) {
if(arguments.callee.activeXStr!=="String"){
var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"], i,length;
try{
for(i=0;lenth=versions.length;i++){
new ActiveXObject(versions[i]);
arguments.callee.activeXStr=version[i];
break;
}
}catch(err){
}
}
return function(){
return new ActiveXObject(versions[i]);
}
}else{
return function(){
throw("No available XHR");
}
}
}
})();
這是一個IIFE,這樣寫只會在第一次加載該代碼片段的時候消耗點性能,之後getXhr也會被確定下來。
記錄備忘!