首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议71:推荐分支函数

关灯直达底部

分支函数解决的一个问题是浏览器之间兼容性的重复判断。解决浏览器之间的兼容性的一般方式是使用if逻辑来进行特性检测或能力检测,根据浏览器不同的实现来实现功能上的兼容,这样做的问题是,每执行一次代码,可能都需要进行一次浏览器兼容性方面的检测,这是没有必要的。能否在代码初始化执行的时候就检测浏览器的兼容性,在之后的代码执行过程中,就无须再进行检测了呢?

答案是:能。分支技术就可以解决这个问题,下面以声明一个XMLHttpRequest实例对象为例进行介绍。


var XHR=function{

var standard={

createXHR:function{

return new XMLHttpRequest;

}

}

var newActionXObject={

createXHR:function{

return new ActionXObject("Msxml2.XMLHTTP");

}

}

var oldActionXObject={

createXHR:function{

return new ActionXObject("Microsoft.XMLHTTP");

}

}

if(standard.createXHR){

return standard;

}else{

try{

newActionXObject.createXHR;

return newActionXObject;

}catch(o){

oldActionXObject.createXHR;

return oldActionXObject;

}

}

};


从上面的例子可以看出,分支的原理就是:声明几个不同名称的对象,但为这些对象声明一个名称相同的方法(这是关键)。这些不同的对象,却拥有相同的方法,根据不同的浏览器设计各自的实现,接着开始进行一次浏览器检测,并且由浏览器检测的结果来决定返回哪一个对象,这样不论返回的是哪一个对象,最后名称相同的方法都作为对外一致的接口。

这是在JavaScript运行期间进行的动态检测,将检测的结果返回赋值给其他的对象,并且提供相同的接口,这样存储的对象就可以使用名称相同的接口了。其实,惰性载入函数跟分支函数在原理上是非常相近的,只是在代码实现方面有差异。