讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議71:推薦分支函數 >

建議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運行期間進行的動態檢測,將檢測的結果返回賦值給其他的對象,並且提供相同的接口,這樣存儲的對象就可以使用名稱相同的接口了。其實,惰性載入函數跟分支函數在原理上是非常相近的,只是在代碼實現方面有差異。