溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript中去抖與節(jié)流的示例分析

發(fā)布時間:2020-12-05 11:21:41 來源:億速云 閱讀:126 作者:小新 欄目:web開發(fā)

小編給大家分享一下JavaScript中去抖與節(jié)流的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

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

<input type="text" oninput="fatch()">

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

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


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

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

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

function jieliu (func, time){// 觸發(fā)時間間隔>time 發(fā)送請求
  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,判斷是否是最后一次請求。

去抖動
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)
    }
  }
}

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

改進如下:

function qudou(func, time){//判斷連續(xù)time時間內(nèi)不觸發(fā),發(fā)送func請求
  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àn)方式還是通過對比“now”與“l(fā)astRun”的時間差,進而減少處理函數(shù)的調(diào)用次數(shù);而防抖還是通過settimeout來延緩處理函數(shù)的調(diào)用時機,進而把多次觸發(fā)的結果匯總一起調(diào)用處理函數(shù)。

以上是“JavaScript中去抖與節(jié)流的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI