JS設(shè)計(jì)模式之惰性模式(二)
惰性模式:減少代碼每次執(zhí)行時(shí)的重復(fù)性判斷,通過重新定義對象來避免原對象中的分支判斷,提高網(wǎng)站性能。
例如針對不同瀏覽器的事件注冊方法:
var AddEvent = function(dom, type, fn){ if(dom.addEventListener){ dom.addEventListener(type, fn, false); }else if(dom.attachEvent){ dom.attachEvent('on'+type, fn); }else{ dom['on'+type] = fn; } }
從上面的方法可以發(fā)現(xiàn),每次為元素綁定事件時(shí),都會進(jìn)行檢測判斷,這是多余的,因?yàn)樵谕粸g覽器中分支判斷結(jié)果是唯一的,不可能走不同的分支。
我們可以用惰性模式來解決這個問題,既然第一次調(diào)用該方法時(shí)已經(jīng)判斷過了,那么就可以在第一次執(zhí)行時(shí)根據(jù)判斷結(jié)果重新定義該方法。
惰性模式主要有兩種實(shí)現(xiàn)方法:
加載即執(zhí)行:JavaScript文件加載時(shí)通過閉包執(zhí)行對方法進(jìn)行重新定義,在頁面加載時(shí)會消耗一定的資源。
var AddEvent = function(dom, type, fn){ if(dom.addEventListener){ return function(dom, type, fn){ dom.addEventListener(type, fn, false); } }else if(dom.attachEvent){ return function(dom, type, fn){ dom.attachEvent('on'+type, fn); } }else{ return function(dom, type, fn){ dom['on'+type] = fn; } } }();
惰性執(zhí)行:第一次執(zhí)行函數(shù)時(shí)在函數(shù)內(nèi)部對其進(jìn)行顯示重寫,最后調(diào)用重寫后的方法完成第一次方法調(diào)用。
var AddEvent = function(dom, type, fn){ if(dom.addEventListener){ AddEvent = function(dom, type, fn){ dom.addEventListener(type, fn, false); } }else if(dom.attachEvent){ AddEvent = function(dom, type, fn){ dom.attachEvent('on'+type, fn); } }else{ AddEvent = function(dom, type, fn){ dom['on'+type] = fn; } } AddEvent(dom, type, fn); };
與加載即執(zhí)行不同的是,JS文件加載完成后,惰性執(zhí)行的函數(shù)還沒有被重新定義,當(dāng)函數(shù)被首次調(diào)用時(shí)才會被重定義。這兩種惰性方式都避免了冗余的分支判斷。
惰性模式的應(yīng)用場景非常廣泛,特別是當(dāng)今瀏覽器種類繁多的現(xiàn)象,很多功能在不同瀏覽器中實(shí)現(xiàn)不一,為了兼容不同的瀏覽器,代碼中往往會有許多對不同瀏覽器的分支判斷,比如事件處理、XMLHttpRequest對象創(chuàng)建等,造成代碼臃腫冗余,惰性模式正好可以解決這種問題,提高代碼執(zhí)行效率。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS獲取子節(jié)點(diǎn)、父節(jié)點(diǎn)和兄弟節(jié)點(diǎn)的方法實(shí)例總結(jié)
這篇文章主要介紹了JS獲取子節(jié)點(diǎn)、父節(jié)點(diǎn)和兄弟節(jié)點(diǎn)的方法,結(jié)合實(shí)例形式總結(jié)分析了JavaScript針對子節(jié)點(diǎn)、父節(jié)點(diǎn)和兄弟節(jié)點(diǎn)獲取相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2018-07-07javascript獲取dom的下一個節(jié)點(diǎn)方法
這篇文章主要介紹了javascript獲取dom的下一個節(jié)點(diǎn)方法,實(shí)現(xiàn)在頁面點(diǎn)擊加減按鈕數(shù)字的累加,需要的朋友可以參考下2014-09-09全面解析Bootstrap表單使用方法(表單控件狀態(tài))
這篇文章全面解析了Bootstrap表單的使用方法,本文重點(diǎn)介紹Bootstrap表單控件狀態(tài)的三種情況,感興趣的小伙伴們可以參考一下2015-11-11swiperjs實(shí)現(xiàn)導(dǎo)航與tab頁的聯(lián)動
這篇文章主要為大家詳細(xì)介紹了swiperjs實(shí)現(xiàn)導(dǎo)航與tab頁的聯(lián)動,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12如何用js實(shí)現(xiàn)判斷是否是小數(shù)
這篇文章主要給大家介紹了關(guān)于如何用js實(shí)現(xiàn)判斷是否是小數(shù)的相關(guān)資料,文中介紹了如何通過使用isNaN()函數(shù)和使用正則表達(dá)式來解決,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2024-04-04