成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

3fuyu / 2128人閱讀

摘要:函數(shù)節(jié)流的實現(xiàn)函數(shù)節(jié)流最普通的實現(xiàn)就是通過取摩操作來過濾部分執(zhí)行。這樣子,就實現(xiàn)了函數(shù)節(jié)流,存在復(fù)雜計算的業(yè)務(wù)邏輯運行次數(shù)減半了。實現(xiàn)又叫函數(shù)節(jié)流,思路是控制某一個時間段執(zhí)行周期內(nèi)觸發(fā)的事件,只會執(zhí)行一次業(yè)務(wù)邏輯。

函數(shù)節(jié)流介紹

頁面在綁定resize,keydown或者mousemove這些能連續(xù)觸發(fā)的事件時,用戶只要很常規(guī)的操作,就能連續(xù)觸發(fā)多次綁定的方法。當(dāng)綁定方法里面存在大量的類似于DOM操作這種極其消耗性能的代碼時,會直接導(dǎo)致頁面運行的卡頓。這個時候就會用到函數(shù)節(jié)流。

函數(shù)節(jié)流的實現(xiàn)

函數(shù)節(jié)流最普通的實現(xiàn)就是通過取摩操作來過濾部分執(zhí)行。參考代碼如下

javascriptvar mousemoveCount = 0;
function mousemoveListener(e){
  mousemoveCount++;
  if(mousemoveCount % 2 === 0){
    return;
  }
  console.info("業(yè)務(wù)邏輯");
}

當(dāng)?shù)谝淮斡|發(fā)并執(zhí)行mousemoveListener事件時,會打印“業(yè)務(wù)邏輯”;緊接著第二次執(zhí)行mousemoveListener事件時,由于mousemoveCount為2,會直接return掉,并不會打印“業(yè)務(wù)邏輯”。這樣子,就實現(xiàn)了函數(shù)節(jié)流,存在復(fù)雜計算的業(yè)務(wù)邏輯運行次數(shù)減半了。

但是這種實現(xiàn)存在兩個問題:

方法的執(zhí)行頻率(或者說幀率)是不可控的。比如mousemove事件,執(zhí)行頻率由鼠標(biāo)移動速度決定,由上面這種方式實現(xiàn),頻率還是由鼠標(biāo)移動速度決定。

最后一次觸發(fā)可能未執(zhí)行。比如當(dāng)最后一次觸發(fā)事件時,mousemoveCount是偶數(shù),那么會直接return。如果業(yè)務(wù)需要最后一次必須執(zhí)行業(yè)務(wù)邏輯,則會存在bug。

所以就有了下面的優(yōu)化實現(xiàn)(throttle和debounce)。

throttle實現(xiàn)

throttle又叫函數(shù)節(jié)流,思路是控制某一個時間段(執(zhí)行周期)內(nèi)觸發(fā)的事件,只會執(zhí)行一次業(yè)務(wù)邏輯。代碼如下:

javascriptvar lastMousemoveTime = 0, mousemoveTime = 100;
function mousemoveListener(e){
  var now = new Date().getTime();
  if(now - lastMousemoveTime <= mousemoveTime) {
    return;
  }
  lastMousemoveTime = now;
  setTimeout(function(){
    console.info("業(yè)務(wù)邏輯");
  }, mousemoveTime);
}

第一次觸發(fā)mousemove會設(shè)置100ms后執(zhí)行業(yè)務(wù)邏輯,在這之后的100ms里面觸發(fā)的mousemove都不會觸發(fā)業(yè)務(wù)邏輯。相當(dāng)于控制了mousemove事件100ms觸發(fā)一次,也就是10幀。

使用這種實現(xiàn)(throttle),可以做到觸發(fā)頻率可控。但當(dāng)業(yè)務(wù)希望連續(xù)的觸發(fā)事件只在之后一次觸發(fā)后才執(zhí)行業(yè)務(wù)邏輯,比如resize事件,只希望窗口變化結(jié)束后才進行業(yè)務(wù)邏輯的運行,throttle實現(xiàn)就不適用了。這個時候就需要使用到debounce

debounce實現(xiàn)

debounce又叫函數(shù)去抖動,思路是業(yè)務(wù)邏輯在resize不在觸發(fā)后才執(zhí)行。代碼如下:

javascriptvar resizeTimer = null;
function resizeListener(e){
  if(resizeTimer) {
    clearTimerout(resizeTimer);
  }
  resizeTimer = setTimeout(function(){
    console.info("業(yè)務(wù)邏輯");
  }, 100);
}

但resize連續(xù)快速觸發(fā)時,業(yè)務(wù)邏輯并不會執(zhí)行。只有當(dāng)最后一次觸發(fā)resize后100ms,才執(zhí)行業(yè)務(wù)邏輯。這種情況就能實現(xiàn)只在最后一次resize觸發(fā)業(yè)務(wù)計算了。

underscore 中已經(jīng)對throttle和debounce做了實現(xiàn)和封裝, 有興趣可以去查看源碼。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85656.html

相關(guān)文章

  • 徹底弄懂函數(shù)防抖和函數(shù)節(jié)流

    摘要:若時間差大于間隔時間,則立刻執(zhí)行一次函數(shù)。不同點函數(shù)防抖,在一段連續(xù)操作結(jié)束后,處理回調(diào),利用和實現(xiàn)。函數(shù)防抖關(guān)注一定時間連續(xù)觸發(fā)的事件只在最后執(zhí)行一次,而函數(shù)節(jié)流側(cè)重于一段時間內(nèi)只執(zhí)行一次。 原博客地址,歡迎star 函數(shù)防抖和節(jié)流 函數(shù)防抖和函數(shù)節(jié)流:優(yōu)化高頻率執(zhí)行js代碼的一種手段,js中的一些事件如瀏覽器的resize、scroll,鼠標(biāo)的mousemove、mouseover...

    Mr_houzi 評論0 收藏0
  • JS進階篇--JS函數(shù)節(jié)流(throttle)

    摘要:函數(shù)節(jié)流的原理函數(shù)節(jié)流的原理挺簡單的,估計大家都想到了,那就是定時器。在高級程序設(shè)計一書有介紹函數(shù)節(jié)流,里面封裝了這樣一個函數(shù)節(jié)流函數(shù),它把定時器存為函數(shù)的一個屬性個人的世界觀不喜歡這種寫法。 什么是函數(shù)節(jié)流? 介紹前,先說下背景。在前端開發(fā)中,有時會為頁面綁定resize事件,或者為一個頁面元素綁定拖拽事件(其核心就是綁定mousemove),這種事件有一個特點,就是用戶不必特地?fù)v亂...

    cpupro 評論0 收藏0
  • JavaScript 函數(shù)節(jié)流函數(shù)去抖應(yīng)用場景辨析

    摘要:函數(shù)節(jié)流和去抖的出現(xiàn)場景,一般都伴隨著客戶端的事件監(jiān)聽。函數(shù)節(jié)流的核心是,讓一個函數(shù)不要執(zhí)行得太頻繁,減少一些過快的調(diào)用來節(jié)流。 概述 也是好久沒更新 源碼解讀,看著房價蹭蹭暴漲,心里也是五味雜陳,對未來充滿恐懼和迷茫 ...(敢問一句你們上岸了嗎) 言歸正傳,今天要介紹的是 underscore 中兩個重要的方法,函數(shù)節(jié)流和函數(shù)去抖。這篇文章不會涉及具體的代碼實現(xiàn)(關(guān)于代碼實現(xiàn)請期...

    ZHAO_ 評論0 收藏0
  • 函數(shù)防抖Debounce和函數(shù)節(jié)流Throttle

    摘要:函數(shù)節(jié)流函數(shù)防抖函數(shù)節(jié)流和函數(shù)防抖函數(shù)節(jié)流和函數(shù)防抖二者很容易被混淆起來。函數(shù)防抖函數(shù)在特定的時間內(nèi)不被再調(diào)用后執(zhí)行。一句話概括函數(shù)節(jié)流是從用戶開始輸入就開始計時,而函數(shù)節(jié)流是從用戶停止輸入開始計時。 函數(shù)節(jié)流 & 函數(shù)防抖 函數(shù)節(jié)流和函數(shù)防抖 函數(shù)節(jié)流和函數(shù)防抖二者很容易被混淆起來。下面貼英文原文,建議認(rèn)真閱讀:Debouncing enforces that a function ...

    NicolasHe 評論0 收藏0
  • 談?wù)刯s中的函數(shù)節(jié)流

    摘要:為了解決這些問題,就可以使用定時器對函數(shù)進行節(jié)流。第一次調(diào)用函數(shù),創(chuàng)建一個定時器,在指定的時間間隔之后運行代碼。當(dāng)?shù)诙握{(diào)用該函數(shù)時,它會清除前一次的定時器并設(shè)置另一個。 函數(shù)節(jié)流的目的 從字面上就可以理解,函數(shù)節(jié)流就是用來節(jié)流函數(shù)從而一定程度上優(yōu)化性能的。例如,DOM 操作比起非DOM 交互需要更多的內(nèi)存和CPU 時間。連續(xù)嘗試進行過多的DOM 相關(guān)操作可能會導(dǎo)致瀏覽器掛起,有時候甚...

    sanyang 評論0 收藏0
  • 前端進擊的巨人(八):淺談函數(shù)防抖與節(jié)流

    摘要:隆重請出主角防抖與節(jié)流。防抖與節(jié)流的異同相同都是防止某一時間段內(nèi),函數(shù)被頻繁調(diào)用執(zhí)行,通過時間頻率控制,減少回調(diào)函數(shù)執(zhí)行次數(shù),來實現(xiàn)相關(guān)性能優(yōu)化。參考文章分鐘理解的節(jié)流防抖及使用場景函數(shù)防抖和節(jié)流 showImg(https://segmentfault.com/img/bVburM8?w=800&h=600); 本篇課題,或許早已是爛大街的解讀文章。不過春招系列面試下來,不少伙伴們還...

    _Zhao 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<