国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript 五十問(wèn)——認(rèn)真聊一聊去抖與節(jié)流

EscapedDog / 2414人閱讀

摘要:前言無(wú)論是面試還是在討論瀏覽器優(yōu)化過(guò)程中,都會(huì)涉及到去抖動(dòng)和節(jié)流的問(wèn)題。總的來(lái)說(shuō),這二者是一種限制事件觸發(fā)頻率的方式。不同的是,節(jié)流會(huì)指定事件觸發(fā)的時(shí)間間隔而去抖動(dòng)會(huì)指定事件不觸發(fā)的時(shí)間間隔。

前言

無(wú)論是面試還是在討論瀏覽器優(yōu)化過(guò)程中,都會(huì)涉及到去抖動(dòng)和節(jié)流的問(wèn)題。
總的來(lái)說(shuō),這二者是一種限制事件觸發(fā)頻率的方式。不同的是,節(jié)流會(huì)指定事件觸發(fā)的時(shí)間間隔;而去抖動(dòng)會(huì)指定事件不觸發(fā)的時(shí)間間隔。從結(jié)果上來(lái)看,節(jié)流降低了時(shí)間處理的敏感度;而去抖對(duì)從觸發(fā)事件先存儲(chǔ)起來(lái),等到超過(guò)指定事件間隔后,一起發(fā)送。
越來(lái)越暈,直接上代碼:
HTML

這里有一個(gè)供用戶搜索使用的input標(biāo)簽,有一個(gè)input事件會(huì)觸發(fā)的處理函數(shù)fatch,這個(gè)fatch會(huì)根據(jù)input的value值向后臺(tái)去請(qǐng)求聯(lián)想詞。
上面代碼思路是沒(méi)有問(wèn)題的,但是如果不做觸發(fā)限制的話,可能會(huì)產(chǎn)生大量的http請(qǐng)求,而這些請(qǐng)求里面很多可能意義不大,為我們的優(yōu)化提供了空間;下面,我就采用節(jié)流和去抖兩種思路來(lái)解決這個(gè)問(wèn)題。(一般針對(duì)input這種情況,使用去抖解決;這里只是方便做代碼說(shuō)明)

節(jié)流
function jieliu (func, time){//func 執(zhí)行函數(shù), time 時(shí)間間隔
  let lastRun = null
  
  return function(){
    const now = new Date()
    if(now - lastRun > time){
      func(...arguments)
      lastRun = now
    }
  }
}


const listener = jieliu(function(value){//監(jiān)聽(tīng)函數(shù),指定間隔時(shí)間
  console.log(value)
}, 1000)

const input = document.querySelector("input")
//調(diào)用方法
input.addEventListener("input", function(event){
     listener(event.target.value)
})

以上是比較簡(jiǎn)單的節(jié)流實(shí)現(xiàn)以及基本的調(diào)用方式;使用閉包是為了保存每一次執(zhí)行的lastRun。基本實(shí)現(xiàn)了限制請(qǐng)求頻率的需求,但忽略了最后一個(gè)的觸發(fā)。
改進(jìn)如下:

function jieliu (func, time){// 觸發(fā)時(shí)間間隔>time 發(fā)送請(qǐng)求
  let lastRun = null
  let timeout = undefined
  return function(){
    const self = this; 
    const now = new Date()
    if(now - lastRun > time){
      if(timeout){
        clearTimeout(timeout)
        timeout = undefined
      }
      func.apply(self, arguments)
      lastRun = now
    }
    else{
      if(!timeout){
        timeout = setTimeout(func.apply(self, arguments), time)
      }
    }
  }
}

加入timeout,判斷是否是最后一次請(qǐng)求。

去抖動(dòng)
function qudou(func, time){
  let timeout = undefined
  
  return function(){
    const argu = arguments
    const self = this

    if(timeout){
      clearTimeout(timeout)
      timeout = undefined
    }else{
        timeout = setTimeout(func.apply(this, arguments), time)
    }
  }
}

以上簡(jiǎn)單實(shí)現(xiàn)去抖動(dòng),同樣,最后一次事件不能夠觸發(fā)處理函數(shù)。

改進(jìn)如下:

function qudou(func, time){//判斷連續(xù)time時(shí)間內(nèi)不觸發(fā),發(fā)送func請(qǐng)求
  let timeout = undefined;
  let lastRun = null
  return function(){
    const self = this
    const now = new Date()
    if(now - lastRun > time){
      func.apply(self, arguments)
    }
    else {
      if(!timeout){
        timeout = setTimeout(func.apply(self, arguments), time)
      }
      else {
        clearTimeout(timeout)
        timeout = undefined
      }
    }
    lastRun = new Date()
  }
}
總結(jié)

通篇寫(xiě)下來(lái),節(jié)流主要的實(shí)現(xiàn)方式還是通過(guò)對(duì)比“now”與“l(fā)astRun”的時(shí)間差,進(jìn)而減少處理函數(shù)的調(diào)用次數(shù);而防抖還是通過(guò)settimeout來(lái)延緩處理函數(shù)的調(diào)用時(shí)機(jī),進(jìn)而把多次觸發(fā)的結(jié)果匯總一起調(diào)用處理函數(shù)。

后記

節(jié)流與去抖動(dòng)兩種方案還是有很大不同的,很多人包括我都很容易搞混。如果大家有更好的解決方案或者需要討論的地方,歡迎在踴躍留言!

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/100905.html

相關(guān)文章

  • JavaScript 十問(wèn)——認(rèn)真聊一聊去抖與節(jié)流

    摘要:前言無(wú)論是面試還是在討論瀏覽器優(yōu)化過(guò)程中,都會(huì)涉及到去抖動(dòng)和節(jié)流的問(wèn)題。總的來(lái)說(shuō),這二者是一種限制事件觸發(fā)頻率的方式。不同的是,節(jié)流會(huì)指定事件觸發(fā)的時(shí)間間隔而去抖動(dòng)會(huì)指定事件不觸發(fā)的時(shí)間間隔。 前言 無(wú)論是面試還是在討論瀏覽器優(yōu)化過(guò)程中,都會(huì)涉及到去抖動(dòng)和節(jié)流的問(wèn)題。總的來(lái)說(shuō),這二者是一種限制事件觸發(fā)頻率的方式。不同的是,節(jié)流會(huì)指定事件觸發(fā)的時(shí)間間隔;而去抖動(dòng)會(huì)指定事件不觸發(fā)的時(shí)間間隔...

    chadLi 評(píng)論0 收藏0
  • Javascript 十問(wèn)——實(shí)現(xiàn)的繼承多種方式

    摘要:組合繼承實(shí)現(xiàn)了屬性分離,方法共享下的完美繼承方案繼承我們的主角,,就是對(duì)組合繼承的改進(jìn)。這也是為什么在子類構(gòu)造函數(shù)中一定要顯示調(diào)用的原因。 談到繼承,或者更廣義上的:一個(gè)對(duì)象可以使用另外一個(gè)對(duì)象的屬性或方法。實(shí)現(xiàn)起來(lái)無(wú)外乎有兩種方式:apply or call 改變this的作用域原型繼承 改變__proto__指向,添加作用域鏈 而JavaScript所有的繼承實(shí)現(xiàn),都是圍繞以上兩點(diǎn)...

    BlackHole1 評(píng)論0 收藏0
  • JavaScript 十問(wèn)——從源碼分析 ES6 Class 的實(shí)現(xiàn)機(jī)制

    摘要:防止類的構(gòu)造函數(shù)以普通函數(shù)的方式調(diào)用。這個(gè)函數(shù)的主要作用是通過(guò)給類添加方法,其中將靜態(tài)方法添加到構(gòu)造函數(shù)上,將非靜態(tài)的方法添加到構(gòu)造函數(shù)的原型對(duì)象上。 Class是ES6中新加入的繼承機(jī)制,實(shí)際是Javascript關(guān)于原型繼承機(jī)制的語(yǔ)法糖,本質(zhì)上是對(duì)原型繼承的封裝。本文將會(huì)討論:1、ES6 class的實(shí)現(xiàn)細(xì)2、相關(guān)Object API盤(pán)點(diǎn)3、Javascript中的繼承實(shí)現(xiàn)方案盤(pán)點(diǎn)...

    LeexMuller 評(píng)論0 收藏0
  • JS中的函數(shù)去抖與節(jié)流

    摘要:上段代碼的一個(gè)問(wèn)題是,事件會(huì)在定時(shí)器結(jié)束后被觸發(fā),因此會(huì)出現(xiàn)一定的延遲,如果想讓事件被立即觸發(fā),可以使用以下的去抖函數(shù)但是,對(duì)于去抖來(lái)說(shuō),在某些場(chǎng)景下是不合適的,因此我們可以使用節(jié)流。 參考文章游戲星人眼中的節(jié)流與去抖(很生動(dòng)) 函數(shù)去抖與節(jié)流 Debounce:函數(shù)去抖就是對(duì)于一定時(shí)間段的連續(xù)的函數(shù)調(diào)用,只讓其執(zhí)行一次Throttle:函數(shù)節(jié)流就是讓連續(xù)執(zhí)行的函數(shù),變成固定時(shí)間段間斷...

    fuchenxuan 評(píng)論0 收藏0
  • JavaScript十問(wèn)——對(duì)比來(lái)說(shuō)CSS的Grid與FlexBox(上篇)

    摘要:前言春節(jié)假期有幸拜讀了張?chǎng)涡翊蟠蟮年P(guān)于與的兩篇文章見(jiàn)參考文獻(xiàn),很有收獲自己在開(kāi)發(fā)的過(guò)程中,很多時(shí)候都會(huì)采用布局,而與這種方式已經(jīng)很少使用了這次在春假期間學(xué)習(xí)了,深感的好用與便利。相對(duì)于,它多出來(lái)一個(gè)的屬性,代表拉伸默認(rèn)屬性。 前言 春節(jié)假期有幸拜讀了張?chǎng)涡翊蟠蟮年P(guān)于Flex與Grid的兩篇文章(見(jiàn)參考文獻(xiàn)),很有收獲;自己在開(kāi)發(fā)的過(guò)程中,很多時(shí)候都會(huì)采用Flex布局,而Float與in...

    xuhong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<