防抖、節流、閉包的真諦所在

哈哈,我也是一個標題黨,今天想總結一下,今天學到的東西,便於從此複習拿出來看。javascript

首先呢,防抖是什麼?java

防抖: 持續觸發事件時,必定時間段內沒有再觸發事件,事件處理函數纔會執行一次,若是設定的時間到來以前,又一次觸發了事件,就從新開始延時。閉包

定義比較難懂,舉一個比較貼切的例子就是 ,坐電梯。  每次電梯開門時就會停留10s鍾等待乘客,當10s中結束後,電梯會自動關門,但若是這時又有乘客進入,則電梯又會等待10s。沒錯,這就是防抖的定義。app

再來介紹一個防抖的應用場景:函數

    例如:使用百度搜索學習資源時,當向輸入框輸入 搜索詞 後,纔會在搜索框推薦與你搜索詞相關的字詞。而不是你每輸入一個字就推薦一下。學習

函數防抖就是解決實時搜索(kepup)、拖拽(mousemove)等問題的。this

 

 

可見,每次觸發事件都會執行回調函數,如今加入防抖處理:3d

var debounce = function(func, delay) {
  var timer = null
  return function() {
      var that = this;
      var args = arguments;
      
      if(timer) {
          clearTimeout(timer);
      }

      timer = setTimeout(function() {
          func.apply(that, args);
      }, delay)
  }
}

ipt.addEventListener('keyup', debounce(function(e){
  console.log(e.target.value);
}, 400))

  效果以下:code

可見,輸入框在中止輸入400ms後執行回調。在防抖後的回調函數用 timer 記錄計時,每次執行回調的時候會先清空以前的計時。注意這裏的timer是閉包變量,始終保持着上一個計時。blog

這就是所謂的防抖。

函數節流

節流throttle: 讓事件的回調必定時間間隔只執行一次。節流函數有兩種實現方式,一種是記錄增量,一種是定時方式。

相關文章
相關標籤/搜索