JS高頻功能優(yōu)化之函數(shù)節(jié)流和函數(shù)防抖

JS高頻功能優(yōu)化之函數(shù)節(jié)流和函數(shù)防抖

一.基本概念

什么是高頻功能辖试?

“高頻”望文取義就是“很快的”劈狐;在JavaScript中,可以理解為對(duì)一個(gè)函數(shù)/事件觸發(fā)次數(shù)很多的肥缔,很快的;典型的例子就是JS中鼠標(biāo)滑輪事件,鼠標(biāo)移動(dòng)事件的觸發(fā)和輸入框聯(lián)想查詢(xún)功能實(shí)現(xiàn)等收班;

JS中為什么要減少高頻的發(fā)生呢?

一句話(huà)總結(jié):“減少高頻摔桦,節(jié)約資源,防止體驗(yàn)差”邻耕;

  1. 節(jié)約開(kāi)銷(xiāo):輸入框的聯(lián)想搜索功能,百度搜索就有聯(lián)想搜索功能燕鸽;聯(lián)想搜索功能的實(shí)現(xiàn),是通過(guò)監(jiān)聽(tīng)用戶(hù)輸入去想后臺(tái)請(qǐng)求相應(yīng)的列表啊研,并加以展示出來(lái);代碼如下:
    var seardom=document.getElementById("search");
    var sear_list=[]; //定義聯(lián)想搜索列表
    seardom.addEventListener("keyup",function(){                              //keyup事件在鍵盤(pán)按鍵釋放時(shí)觸發(fā)
        //由于ajax是異步的党远,并具有一定的延時(shí)性,所以通過(guò)setTimeout表示數(shù)據(jù)請(qǐng)求
        setTimeout(function(res){//res表示后臺(tái)返回的數(shù)據(jù)
            sear_list=res.datas; //后臺(tái)返回的聯(lián)想搜索列表
        },2000);
    });

上述代碼是個(gè)Demo麸锉,通過(guò)以上代碼可知舆声,每次鍵盤(pán)按鍵釋放時(shí)就會(huì)觸發(fā)請(qǐng)求,這就是個(gè)“高頻”的動(dòng)作媳握;會(huì)造成沒(méi)必要的HTTP請(qǐng)求資源浪費(fèi);

  1. 防止體驗(yàn)差:拖拽功能實(shí)現(xiàn)蛾找,現(xiàn)在有很多網(wǎng)頁(yè)都擁有拖拽功能;比如網(wǎng)頁(yè)版的照片查看器打毛,就去要對(duì)圖片進(jìn)行拖拽查看;如果沒(méi)做優(yōu)化處理幻枉,那么拖拽過(guò)程中會(huì)出現(xiàn)卡頓,不靈活等體驗(yàn)性差的問(wèn)題熬甫;

二.怎樣用JS解決高頻問(wèn)題呢?

如果不通過(guò)第三方框架處理高頻問(wèn)題,如RXJS異步框架瞻颂;只用JS來(lái)處理高頻,那么就需要函數(shù)節(jié)流和函數(shù)防抖這兩種方案贡这;

1.什么是函數(shù)節(jié)流?

函數(shù)節(jié)流就是在一定時(shí)間內(nèi)只能執(zhí)行做一件事情(這里的事情指的是重復(fù)的事情)藕坯;例如:吃飯,飯要一口一口吃炼彪,等一口咽下去了就吃下一口,如果一口沒(méi)咽下去就急忙吃下一口辐马,就容易咽卓介佟冗疮;在實(shí)現(xiàn)某些功能的時(shí)候,程序也是如此檩帐;如上訴所說(shuō)的圖片拖拽功能;
實(shí)現(xiàn)要點(diǎn):通過(guò)定義一個(gè)標(biāo)識(shí)來(lái)記錄某函數(shù)是否在執(zhí)行湃密,如果在執(zhí)行,就return false泛源;如果沒(méi)有執(zhí)行,就執(zhí)行該方法达箍;代碼如下:

   var dom=document.getElementById("dom"); //需要拖拽的dom
   var isBool=false; //定義是否執(zhí)行的標(biāo)識(shí)
   dom.addEventListener("mousemove",function(){ //監(jiān)聽(tīng)鼠標(biāo)移動(dòng)件
       if(isBool){//true在執(zhí)行,false沒(méi)有執(zhí)行
           return false;
       }
       isBool=true;
       setTimeout(function(){//設(shè)置定時(shí)函數(shù)setTimeout缎玫,每60ms執(zhí)行一次
           isBool=false;
           //dosomething......
      },60);
   });

2.什么是函數(shù)防抖?

函數(shù)防抖就是在一定時(shí)間內(nèi)要連續(xù)不斷的做一件事赃磨,前提是清除前面正在做的事情(這里的事情是指重復(fù)的事情);例如:吃飯煞躬,正常人吃飯的程序是在一定時(shí)間內(nèi)逸邦,一口咽下去再吃下一口(函數(shù)節(jié)流),非正常人吃飯的程序是在一定時(shí)間內(nèi)當(dāng)一口還沒(méi)咽下去缕减,然后來(lái)了下一口飯的時(shí)候,就將上一口飯給吐出來(lái)桥狡,一直重復(fù)此動(dòng)作,一直到最后一口飯才咽下去(函數(shù)防抖)皱卓。請(qǐng)勿模范,后果自負(fù)娜汁;
實(shí)現(xiàn)要點(diǎn):通過(guò)setTimeout()實(shí)現(xiàn)延時(shí)執(zhí)行某方法,例如延時(shí)時(shí)間2s掐禁,如果2s范圍內(nèi)接著執(zhí)行該方法,就需要用clearTimeout()方法清除上一個(gè)setTimeout的延時(shí)執(zhí)行的方法傅事;代碼如下:

var seardom=document.getElementById("search");
var sear_list=[]; //定義聯(lián)想搜索列表
var timeout=null;
seardom.addEventListener("keyup",function(){ //keyup事件在鍵盤(pán)按鍵釋放時(shí)觸發(fā)
    if(timeout != null){ //timeout!=null的時(shí)候,清除上個(gè)延時(shí)的方法
       clearTimeout(timeout);
    }
    timeout=setTimeout(function(res){//res表示后臺(tái)返回的數(shù)據(jù)
        sear_list=res.datas; //后臺(tái)返回的聯(lián)想搜索列表
    },2000);
});

三.函數(shù)節(jié)流和函數(shù)防抖的不同性總結(jié):

其實(shí)就是一句話(huà)“節(jié)流做事有始有終蹭越,要排隊(duì);防抖做事始亂終棄响鹃,也要排隊(duì)”;但是節(jié)流和防抖有個(gè)共性茴迁,就是做的事情都是一樣一樣的萤衰;
“節(jié)流做事有始有終,要排隊(duì)”:就是等上一件事情做完脆栋,才能做下一件事情倦卖;
“防抖做事始亂終棄怕膛,也要排隊(duì)”:上一件事情還沒(méi)做完,就清除上件事情做下一件事情秦踪;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掸茅,一起剝皮案震驚了整個(gè)濱河市柠逞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌板壮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绰精,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡笨使,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)阱表,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人最爬,你說(shuō)我怎么就攤上這事“拢” “怎么了烤送?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵帮坚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我互艾,道長(zhǎng),這世上最難降的妖魔是什么纫普? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮昨稼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘假栓。我一直安慰自己,他們只是感情好匾荆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布杆烁。 她就那樣靜靜地躺著,像睡著了一般连躏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贞滨,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音晓铆,去河邊找鬼。 笑死骄噪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的链蕊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼滔韵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了陪蜻?” 一聲冷哼從身側(cè)響起邦马,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤滋将,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后症昏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肝谭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年掘宪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了分苇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屁桑。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蘑斧,靈堂內(nèi)的尸體忽然破棺而出靖秩,到底是詐尸還是另有隱情,我是刑警寧澤沟突,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站惠拭,受9級(jí)特大地震影響扩劝,放射性物質(zhì)發(fā)生泄漏职辅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一域携、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秀鞭,春花似錦、人聲如沸锋边。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至搀矫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓤球,已是汗流浹背融欧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工噪馏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绿饵。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拟赊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吸祟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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