初始化時分支,也稱載入時分支是一種優化模式,當知道某個條件在整個程式生命周期內不會發生改變的時候,進隊該條件測試一次是很有意義的。 以事件監聽代碼為例: 以上代碼的問題在於效率比較低下,每次在調用addListener()或removeListener()時,都會重覆地執行相同的檢查 當使用初始化時 ...
初始化時分支,也稱載入時分支是一種優化模式,當知道某個條件在整個程式生命周期內不會發生改變的時候,進隊該條件測試一次是很有意義的。
以事件監聽代碼為例:
1 var utils={ 2 addListener: function (el, type, fn) { 3 if(typeof window.addEventListener==="function"){ 4 el.addEventListener(type,fn,false); 5 }else if(typeof window.attachEvent==="function"){ //IE瀏覽器 6 el.attachEvent("on"+type,fn); 7 }else{ //更早版本瀏覽器 8 el["on"+type]=fn; 9 } 10 }, 11 removeListener: function (el, type, fn) { 12 if(typeof window.removeEventListener==="function"){ 13 el.removeEventListener(type,fn,false); 14 }else if(typeof window.detachEvent==="function"){ 15 el.detachEvent("on"+type,fn); 16 }else{ 17 el["on"+type]=null; 18 } 19 } 20 };
以上代碼的問題在於效率比較低下,每次在調用addListener()或removeListener()時,都會重覆地執行相同的檢查
當使用初始化時分支的時候,可以在腳本初始化載入時一次性探測出瀏覽器特征。
修改後的代碼如下:
1 var utils={ 2 addListener:null, 3 removeListener:null 4 }; 5 if(typeof window.addEventListener==="function"){ 6 utils.addListener= function (el, type, fn) { 7 el.addEventListener(type,fn,false); 8 }; 9 utils.removeListener= function (el, type, fn) { 10 el.removeEventListener(type,fn,false); 11 }; 12 }else if(typeof window.attachEvent==="function"){ 13 utils.addListener= function (el, type, fn) { 14 el.attachEvent("on"+type,fn); 15 }; 16 utils.removeListener= function (el, type, fn) { 17 el.detachEvent("on"+type,fn); 18 }; 19 }else{ 20 utils.addListener= function (el, type, fn) { 21 el["on"+type]=fn; 22 }; 23 utils.removeListener= function (el, type, fn) { 24 el["on"+type]=null; 25 }; 26 }
分開嗅探瀏覽器特征,然後使用載入時分支僅執行一次嗅探。