分支函數解決的一個問題是瀏覽器之間兼容性的重複判斷。解決瀏覽器之間的兼容性的一般方式是使用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運行期間進行的動態檢測,將檢測的結果返回賦值給其他的對象,並且提供相同的接口,這樣存儲的對象就可以使用名稱相同的接口了。其實,惰性載入函數跟分支函數在原理上是非常相近的,只是在代碼實現方面有差異。