javaScript性能優(yōu)化之代碼優(yōu)化

利用函數(shù)的惰性載入提高 javaScript 代碼性能

在 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 分支和不必要的代碼娜扇,因此提升了代碼性能错沃,至于那種方式更合適,就要看您的需求而定了袱衷。

原文地址: https://justjavac.com/javascript/2013/10/16/function-of-the-inertia-load.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捎废,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子致燥,更是在濱河造成了極大的恐慌,老刑警劉巖排截,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫌蚤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡断傲,警方通過(guò)查閱死者的電腦和手機(jī)脱吱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)认罩,“玉大人箱蝠,你說(shuō)我怎么就攤上這事。” “怎么了宦搬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵牙瓢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我间校,道長(zhǎng)矾克,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任憔足,我火速辦了婚禮胁附,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘滓彰。我一直安慰自己控妻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布揭绑。 她就那樣靜靜地躺著弓候,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洗做。 梳的紋絲不亂的頭發(fā)上弓叛,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音诚纸,去河邊找鬼撰筷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛畦徘,可吹牛的內(nèi)容都是我干的毕籽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼井辆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼关筒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起杯缺,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蒸播,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后萍肆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體袍榆,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年塘揣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了包雀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亲铡,死狀恐怖才写,靈堂內(nèi)的尸體忽然破棺而出葡兑,到底是詐尸還是另有隱情,我是刑警寧澤赞草,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布讹堤,位于F島的核電站,受9級(jí)特大地震影響房资,放射性物質(zhì)發(fā)生泄漏蜕劝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一轰异、第九天 我趴在偏房一處隱蔽的房頂上張望岖沛。 院中可真熱鬧,春花似錦搭独、人聲如沸婴削。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)唉俗。三九已至,卻和暖如春配椭,著一層夾襖步出監(jiān)牢的瞬間虫溜,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工股缸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衡楞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓敦姻,卻偏偏與公主長(zhǎng)得像瘾境,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子镰惦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 函數(shù)和對(duì)象 1迷守、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門(mén)語(yǔ)言來(lái)說(shuō)都是核心的概念。通過(guò)函數(shù)可以封裝任意多條語(yǔ)句旺入,而且...
    道無(wú)虛閱讀 4,566評(píng)論 0 5
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5兑凿? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,489評(píng)論 1 45
  • 第3章 基本概念 3.1 語(yǔ)法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類(lèi)型 5種簡(jiǎn)單數(shù)據(jù)類(lèi)型:Unde...
    RickCole閱讀 5,128評(píng)論 0 21
  • 云是會(huì)飛的鞋子 飛過(guò)高山 飛過(guò)大海 云是天上飄浮的宮殿 宮殿里有王 有軍官 云是魔術(shù)師 一會(huì)兒變成麒麟 一會(huì)兒變成...
    shovio閱讀 217評(píng)論 0 0
  • 1.觀點(diǎn)鮮明茵瘾,表明我們有想法個(gè)性急膀,每個(gè)人都是世上獨(dú)一無(wú)二的。 做自己龄捡,才不會(huì)讓我們被世界淹沒(méi)。 但我們卻不能固執(zhí)己...
    若心向陽(yáng)閱讀 283評(píng)論 0 1