利用函數(shù)的惰性載入提高javascript代碼執(zhí)行效率
更新時(shí)間:2014年05月05日 09:19:59 作者:
在 addEvent 函數(shù)每次調(diào)用的時(shí)候都要走一遍,如果瀏覽器支持其中的一種方法,那么他就會(huì)一直支持了,就沒(méi)有必要再進(jìn)行其他分支的檢測(cè)了
在 javascript 代碼中,因?yàn)楦鳛g覽器之間的行為的差異,我們經(jīng)常會(huì)在函數(shù)中包含了大量的 if 語(yǔ)句,以檢查瀏覽器特性,解決不同瀏覽器的兼容問(wèn)題。 例如,我們最常見(jiàn)的為 dom 節(jié)點(diǎn)添加事件的函數(shù):
function addEvent (type, element, fun) {
if (element.addEventListener) {
element.addEventListener(type, fun, false);
}
else if(element.attachEvent){
element.attachEvent('on' + type, fun);
}
else{
element['on' + type] = fun;
}
}
每次調(diào)用 addEvent 函數(shù)的時(shí)候,它都要對(duì)瀏覽器所支持的能力進(jìn)行檢查,首先檢查是否支持addEventListener 方法,如果不支持,再檢查是否支持 attachEvent 方法,如果還不支持,就用 dom 0 級(jí)的方法添加事件。 這個(gè)過(guò)程,在 addEvent 函數(shù)每次調(diào)用的時(shí)候都要走一遍,其實(shí),如果瀏覽器支持其中的一種方法,那么他就會(huì)一直支持了,就沒(méi)有必要再進(jìn)行其他分支的檢測(cè)了, 也就是說(shuō),if 語(yǔ)句不必每次都執(zhí)行,代碼可以運(yùn)行的更快一些。
解決的方案就是稱(chēng)之為惰性載入的技巧。
所謂惰性載入,就是說(shuō)函數(shù)的if分支只會(huì)執(zhí)行一次,之后調(diào)用函數(shù)時(shí),直接進(jìn)入所支持的分支代碼。 有兩種實(shí)現(xiàn)惰性載入的方式,第一種事函數(shù)在第一次調(diào)用時(shí),對(duì)函數(shù)本身進(jìn)行二次處理,該函數(shù)會(huì)被覆蓋為符合分支條件的函數(shù),這樣對(duì)原函數(shù)的調(diào)用就不用再經(jīng)過(guò)執(zhí)行的分支了, 我們可以用下面的方式使用惰性載入重寫(xiě) addEvent()。
function addEvent (type, element, fun) {
if (element.addEventListener) {
addEvent = function (type, element, fun) {
element.addEventListener(type, fun, false);
}
}
else if(element.attachEvent){
addEvent = function (type, element, fun) {
element.attachEvent('on' + type, fun);
}
}
else{
addEvent = function (type, element, fun) {
element['on' + type] = fun;
}
}
return addEvent(type, element, fun);
}
在這個(gè)惰性載入的 addEvent() 中,if 語(yǔ)句的每個(gè)分支都會(huì)為 addEvent 變量賦值,有效覆蓋了原函數(shù)。 最后一步便是調(diào)用了新賦函數(shù)。下一次調(diào)用 addEvent() 的時(shí)候,便會(huì)直接調(diào)用新賦值的函數(shù),這樣就不用再執(zhí)行if 語(yǔ)句了。
第二種實(shí)現(xiàn)惰性載入的方式是在聲明函數(shù)時(shí)就指定適當(dāng)?shù)暮瘮?shù)。 這樣在第一次調(diào)用函數(shù)時(shí)就不會(huì)損失性能了,只在代碼加載時(shí)會(huì)損失一點(diǎn)性能。 一下就是按照這一思路重寫(xiě)的 addEvent()。
var addEvent = (function () {
if (document.addEventListener) {
return function (type, element, fun) {
element.addEventListener(type, fun, false);
}
}
else if (document.attachEvent) {
return function (type, element, fun) {
element.attachEvent('on' + type, fun);
}
}
else {
return function (type, element, fun) {
element['on' + type] = fun;
}
}
})();
這個(gè)例子中使用的技巧是創(chuàng)建一個(gè)匿名的自執(zhí)行函數(shù),通過(guò)不同的分支以確定應(yīng)該使用那個(gè)函數(shù)實(shí)現(xiàn),實(shí)際的邏輯都一樣, 不一樣的地方就是使用了函數(shù)表達(dá)式(使用了 var 定義函數(shù))和新增了一個(gè)匿名函數(shù),另外每個(gè)分支都返回一個(gè)正確的函數(shù),并立即將其賦值給變量 addEvent。
惰性載入函數(shù)的優(yōu)點(diǎn)只執(zhí)行一次 if 分支,避免了函數(shù)每次執(zhí)行時(shí)候都要執(zhí)行 if 分支和不必要的代碼,因此提升了代碼性能,至于那種方式更合適,就要看您的需求而定了。
復(fù)制代碼 代碼如下:
function addEvent (type, element, fun) {
if (element.addEventListener) {
element.addEventListener(type, fun, false);
}
else if(element.attachEvent){
element.attachEvent('on' + type, fun);
}
else{
element['on' + type] = fun;
}
}
每次調(diào)用 addEvent 函數(shù)的時(shí)候,它都要對(duì)瀏覽器所支持的能力進(jìn)行檢查,首先檢查是否支持addEventListener 方法,如果不支持,再檢查是否支持 attachEvent 方法,如果還不支持,就用 dom 0 級(jí)的方法添加事件。 這個(gè)過(guò)程,在 addEvent 函數(shù)每次調(diào)用的時(shí)候都要走一遍,其實(shí),如果瀏覽器支持其中的一種方法,那么他就會(huì)一直支持了,就沒(méi)有必要再進(jìn)行其他分支的檢測(cè)了, 也就是說(shuō),if 語(yǔ)句不必每次都執(zhí)行,代碼可以運(yùn)行的更快一些。
解決的方案就是稱(chēng)之為惰性載入的技巧。
所謂惰性載入,就是說(shuō)函數(shù)的if分支只會(huì)執(zhí)行一次,之后調(diào)用函數(shù)時(shí),直接進(jìn)入所支持的分支代碼。 有兩種實(shí)現(xiàn)惰性載入的方式,第一種事函數(shù)在第一次調(diào)用時(shí),對(duì)函數(shù)本身進(jìn)行二次處理,該函數(shù)會(huì)被覆蓋為符合分支條件的函數(shù),這樣對(duì)原函數(shù)的調(diào)用就不用再經(jīng)過(guò)執(zhí)行的分支了, 我們可以用下面的方式使用惰性載入重寫(xiě) addEvent()。
復(fù)制代碼 代碼如下:
function addEvent (type, element, fun) {
if (element.addEventListener) {
addEvent = function (type, element, fun) {
element.addEventListener(type, fun, false);
}
}
else if(element.attachEvent){
addEvent = function (type, element, fun) {
element.attachEvent('on' + type, fun);
}
}
else{
addEvent = function (type, element, fun) {
element['on' + type] = fun;
}
}
return addEvent(type, element, fun);
}
在這個(gè)惰性載入的 addEvent() 中,if 語(yǔ)句的每個(gè)分支都會(huì)為 addEvent 變量賦值,有效覆蓋了原函數(shù)。 最后一步便是調(diào)用了新賦函數(shù)。下一次調(diào)用 addEvent() 的時(shí)候,便會(huì)直接調(diào)用新賦值的函數(shù),這樣就不用再執(zhí)行if 語(yǔ)句了。
第二種實(shí)現(xiàn)惰性載入的方式是在聲明函數(shù)時(shí)就指定適當(dāng)?shù)暮瘮?shù)。 這樣在第一次調(diào)用函數(shù)時(shí)就不會(huì)損失性能了,只在代碼加載時(shí)會(huì)損失一點(diǎn)性能。 一下就是按照這一思路重寫(xiě)的 addEvent()。
復(fù)制代碼 代碼如下:
var addEvent = (function () {
if (document.addEventListener) {
return function (type, element, fun) {
element.addEventListener(type, fun, false);
}
}
else if (document.attachEvent) {
return function (type, element, fun) {
element.attachEvent('on' + type, fun);
}
}
else {
return function (type, element, fun) {
element['on' + type] = fun;
}
}
})();
這個(gè)例子中使用的技巧是創(chuàng)建一個(gè)匿名的自執(zhí)行函數(shù),通過(guò)不同的分支以確定應(yīng)該使用那個(gè)函數(shù)實(shí)現(xiàn),實(shí)際的邏輯都一樣, 不一樣的地方就是使用了函數(shù)表達(dá)式(使用了 var 定義函數(shù))和新增了一個(gè)匿名函數(shù),另外每個(gè)分支都返回一個(gè)正確的函數(shù),并立即將其賦值給變量 addEvent。
惰性載入函數(shù)的優(yōu)點(diǎn)只執(zhí)行一次 if 分支,避免了函數(shù)每次執(zhí)行時(shí)候都要執(zhí)行 if 分支和不必要的代碼,因此提升了代碼性能,至于那種方式更合適,就要看您的需求而定了。
您可能感興趣的文章:
- JavaScript惰性求值的一種實(shí)現(xiàn)方法示例
- JS設(shè)計(jì)模式之惰性模式(二)
- JavaScript學(xué)習(xí)筆記之惰性函數(shù)示例詳解
- JS 學(xué)習(xí)總結(jié)之正則表達(dá)式的懶惰性和貪婪性
- JS優(yōu)化與惰性載入函數(shù)實(shí)例分析
- js正則表達(dá)式惰性匹配和貪婪匹配用法分析
- JavaScript AJAX之惰性載入函數(shù)
- JavaScript 函數(shù)惰性載入的實(shí)現(xiàn)及其優(yōu)點(diǎn)介紹
- 如何用JavaScript實(shí)現(xiàn)一個(gè)數(shù)組惰性求值庫(kù)
相關(guān)文章
淺談JavaScript 函數(shù)參數(shù)傳遞到底是值傳遞還是引用傳遞
下面小編就為大家?guī)?lái)一篇淺談JavaScript 函數(shù)參數(shù)傳遞到底是值傳遞還是引用傳遞。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
微信小程序藍(lán)牙連接小票打印機(jī)實(shí)例代碼詳解
這篇文章主要介紹了微信小程序藍(lán)牙連接小票打印機(jī)實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
使用BootStrap實(shí)現(xiàn)表格隔行變色及hover變色并在需要時(shí)出現(xiàn)滾動(dòng)條
這篇文章主要介紹了使用BootStrap實(shí)現(xiàn)表格隔行變色及hover變色并在需要時(shí)出現(xiàn)滾動(dòng)條效果,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01
JS輕松實(shí)現(xiàn)CSS設(shè)置,DIV+CSS常用CSS設(shè)置
JS輕松實(shí)現(xiàn)CSS設(shè)置,DIV+CSS常用CSS設(shè)置...2007-02-02
微信小程序?qū)崿F(xiàn)滑動(dòng)/點(diǎn)擊切換Tab及scroll-left的使用
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)滑動(dòng)/點(diǎn)擊切換Tab,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
詳解JS數(shù)組Reduce()方法詳解及高級(jí)技巧
reduce 為數(shù)組中的每一個(gè)元素依次執(zhí)行回調(diào)函數(shù),不包括數(shù)組中被刪除或從未被賦值的元素。接下來(lái)通過(guò)本文給大家分享JS數(shù)組Reduce()方法詳解及高級(jí)技巧,一起看看吧2017-08-08
javascript與asp.net(c#)互相調(diào)用方法
js與C#之間相互調(diào)用的一些方法2009-12-12

