背景
在開(kāi)發(fā)過(guò)程中,有時(shí)候需要對(duì)瀏覽器環(huán)境進(jìn)行檢測(cè),比如封裝一個(gè)AJAX函數(shù)的時(shí)候需要寫(xiě)一個(gè)函數(shù)進(jìn)行檢測(cè),但是常規(guī)的寫(xiě)法有點(diǎn)累贅了,會(huì)檢測(cè)很多遍,但是瀏覽器環(huán)境是固定不變的,檢測(cè)只需要檢測(cè)一遍.這樣就會(huì)造成每次調(diào)用這個(gè)函數(shù)的時(shí)候?yàn)g覽器都會(huì)浪費(fèi)太多時(shí)間去再檢測(cè)一次.這時(shí)候就應(yīng)該用到惰性函數(shù)來(lái)解決這個(gè)問(wèn)題
惰性函數(shù)
惰性載入表示函數(shù)執(zhí)行的分支只會(huì)在函數(shù)第一次掉用的時(shí)候執(zhí)行,在第一次調(diào)用過(guò)程中,該函數(shù)會(huì)被覆蓋為另一個(gè)按照合適方式執(zhí)行的函數(shù),這樣任何對(duì)原函數(shù)的調(diào)用就不用再經(jīng)過(guò)執(zhí)行的分支了。
下面看一段JS代碼:
function createXHR() {
var xhr;
if (typeof XMLHttpRequest != 'undefined') {
xhr = new XMLHttpRequest();
createXHR = function() {
return new XMLHttpRequest();
}
} else {
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
createXHR = function() {
return new ActiveXObject("Msxml2.XMLHTTP");
}
} catch (e) {
try {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
createXHR = function() {
return new ActiveXObject("Microsoft.XMLHTTP");
}
} catch (e) {
createXHR = function() {
return null;
}
}
}
}
return xhr
}
什么意思呢?就是說(shuō)這個(gè)函數(shù)在執(zhí)行第一次的時(shí)候正常判斷,只是條件成立的時(shí)候會(huì)重新改寫(xiě)這個(gè)函數(shù),并返回相應(yīng)的結(jié)果,這樣下次調(diào)用的時(shí)候就不會(huì)浪費(fèi)時(shí)間再去判斷相關(guān)環(huán)境了