有时候我们写的一段代码,用分支控制语句来决定程序的走向,有时候当运行环境一定的时候,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也会被确定下来。
记录备忘!