Debounce & Throttle Function
2017年8月30日
一般綁定 DOM 事件(resize、scroll、mousemove和keydown/keyup/keypress等)的時候,常常會因為事件觸發的太頻繁而導致網頁效能低落。
所以我們可以在事件要執行前加一個控制器,降低事件的觸發頻率,最常使用的就是debounce 和 throttle 這兩個方法,兩者都是用來控制某個事件在一定時間內執行多少次數,看起來非常相似但又有些不同。
Debounce
用戶停止某個操作一段時間之後才執行相應的監聽事件
例如,調整瀏覽器視窗大小的時候,會觸發很多次 resize 事件,可以使用 debounce 方法在停止調整視窗大小的時候在去觸發相應功能。

造輪子
觸發 -> 記錄觸發時間 -> 上次動作觸發時間大於限制時間 -> 執行動作
1 | /** |
參數
immediate,設定函數在一個時間區間的最開始(true)執行,還是最後(false)執行。
呼叫方式
1 | var handleScroll = debounce(function() { |
Throttle
控制監聽事件固定在每 X 毫秒內執行一次
例如,不管滑鼠移動(mousemove事件)的速度多快,固定在每 250ms 執行一次。

造輪子
觸發 -> 上次動作執行時間大於限制時間 -> 執行動作,記錄執行時間
1 | /** |
呼叫方式
1 | var handleScroll = throttle(function() { |
使用 Underscore.js 中的 _.debounce 和 _.throttle
不想重新造輪子的話可以直接使用 Underscore 或 Lodash。
另外可以使用 Lodash 的指令列工具,產生只有 _.debounce 和 _.throttle 的壓縮檔。
1 | npm i -g lodash-cli |
呼叫方式
1 | $(window).on('scroll', _.debounce(doSomething, 250)); |
