防抖節(jié)流

防抖節(jié)流函數(shù):

防抖:

當持續(xù)觸發(fā)事件時, 一定時間內(nèi)沒有再觸發(fā)胡桃,事件處理函數(shù)執(zhí)行一次旁蔼,如果設(shè)定的時間到來之前梳凛,又一次觸發(fā)了事件耿币,就重新開始延時
假如期限值是200ms
1、在200ms 內(nèi)沒有再次觸發(fā)事件韧拒,那么就執(zhí)行函數(shù)淹接;
2、如果在200ms 內(nèi)再次觸發(fā)了滾動事件叛溢,那么當前計時器取消塑悼,重新開始計時;


image.png
function debounce(fn,delay){
let timer = null;
return function(){
   if(timer){
//進入該分支語句楷掉,說明當前正在一個計時過程中厢蒜,并且又觸發(fā)了相同事件。所以要取消當前的計時烹植,重新開始計時
    clearTimeout(timer)
   }
   timer = setTimeout(fn,delay)
}
}

//防抖debounce代碼:
function debounce(fn,delay) {
    var timeout = null; // 創(chuàng)建一個標記用來存放定時器的返回值
    return function (e) {
        // 每當用戶輸入的時候把前一個 setTimeout clear 掉
       if(timeout){
        clearTimeout(timeout); 
       }
        
        // 然后又創(chuàng)建一個新的 setTimeout, 這樣就能保證interval 間隔內(nèi)如果時間持續(xù)觸發(fā)斑鸦,就不會執(zhí)行 fn 函數(shù)
        timeout = setTimeout(() => {
            fn.apply(this, arguments);
        }, delay);
    };
}
// 處理函數(shù)
function handle() {
    console.log('防抖:', Math.random());
}
        
//滾動事件
window.addEventListener('scroll', debounce(handle,500));

節(jié)流函數(shù):

當持續(xù)觸發(fā)事件時,保證一定時間段內(nèi)只調(diào)用一次事件處理函數(shù)草雕。

函數(shù)防抖(debounce):觸發(fā)高頻事件后n秒內(nèi)函數(shù)只會執(zhí)行一次巷屿,如果n秒內(nèi)高頻事件再次被觸發(fā),則重新計算時間墩虹。
函數(shù)節(jié)流(throttle):高頻事件觸發(fā)嘱巾,但在n秒內(nèi)只會執(zhí)行一次憨琳,所以節(jié)流會稀釋函數(shù)的執(zhí)行頻率。

實現(xiàn)函數(shù)節(jié)流我們主要有兩種方法:時間戳和定時器

image.png
// 節(jié)流 (時間戳)
var throttle = function(fn,delay){   
   var pre = Date.now();
   return function(){
     var _this = this;
     var args = arguments;
     var now = Date.now();
     if(now-pre>=delay){
       fn.apply(_this,args);
      pre = Date.now()
     }
   }
}

function handle() {            
  console.log(Math.random());        
}        
window.addEventListener('scroll', throttle(handle, 1000));

當觸發(fā)事件的時候旬昭,我們設(shè)置一個定時器篙螟,再次觸發(fā)事件的時候,如果定時器存在问拘,就不執(zhí)行闲擦,直到delay時間后,定時器執(zhí)行執(zhí)行函數(shù)场梆,并且清空定時器墅冷,這樣就可以設(shè)置下個定時器。

// 定時器
 var throttle = function (fn,delay){
      var timer = null;
      return function (){
        var _this = this;
        var args= arguments;
        if(!timer){
          timer = setTimeout(()=>{
            fn.apply(_this,args)
            timer = null
          },delay)
        }
      }
    }

當remaining<=0時表示該執(zhí)行事件處理函數(shù)了(保證了第一次觸發(fā)事件就能立即執(zhí)行事件處理函數(shù)和每隔delay時間執(zhí)行一次事件處理函數(shù))或油。
如果還沒到時間的話就設(shè)定在remaining時間后再觸發(fā) (保證了最后一次觸發(fā)事件后還能再執(zhí)行一次事件處理函數(shù))寞忿。
當然在remaining這段時間中如果又一次觸發(fā)事件,那么會取消當前的計時器顶岸,并重新計算一個remaining來判斷當前狀態(tài)腔彰。

// 節(jié)流throttle代碼(時間戳+定時器):
    var throttle = function (fn,delay){
     var timer = null;
     var startTime = Date.now(); // 進來開始的時間
     return function(){
       var currentTime = Date.now();
       var remaining = delay-(currentTime-startTime);
       var _this = this;
       var args = arguments;
       clearTimeout(timer);
       if(remaining<=0){
         fn.apply(_this.args)
         startTime = Date.now()
       }else{
         timer = setTimeout(fn,remaining)
       }

     }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辖佣,隨后出現(xiàn)的幾起案子霹抛,更是在濱河造成了極大的恐慌,老刑警劉巖卷谈,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杯拐,死亡現(xiàn)場離奇詭異,居然都是意外死亡世蔗,警方通過查閱死者的電腦和手機端逼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來污淋,“玉大人顶滩,你說我怎么就攤上這事〈绫” “怎么了礁鲁?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赁豆。 經(jīng)常有香客問我仅醇,道長,這世上最難降的妖魔是什么歌憨? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任着憨,我火速辦了婚禮,結(jié)果婚禮上务嫡,老公的妹妹穿的比我還像新娘甲抖。我一直安慰自己,他們只是感情好心铃,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布准谚。 她就那樣靜靜地躺著,像睡著了一般去扣。 火紅的嫁衣襯著肌膚如雪柱衔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天愉棱,我揣著相機與錄音唆铐,去河邊找鬼。 笑死奔滑,一個胖子當著我的面吹牛艾岂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播朋其,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼王浴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了梅猿?” 一聲冷哼從身側(cè)響起氓辣,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袱蚓,沒想到半個月后钞啸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡喇潘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年爽撒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片响蓉。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡硕勿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出枫甲,到底是詐尸還是另有隱情源武,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布想幻,位于F島的核電站粱栖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏脏毯。R本人自食惡果不足惜闹究,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望食店。 院中可真熱鬧渣淤,春花似錦赏寇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至用踩,卻和暖如春渠退,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脐彩。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工碎乃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惠奸。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓梅誓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晨川。 傳聞我的和親對象是個殘疾皇子证九,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345