Debouncing(防抖动)


2011 年,Twitter 出了一个问题:当滚动 Twitter 摘要时,页面变的很卡甚至无响应。John Resig 写了一篇关于这个问题的博客,解释了直接将耗时的函数绑定在 scroll 事件上是一个多么糟糕的想法。

Debouncing 是解决这个问题的一种方法,它的做法是限制下次函数调用之前必须等待的时间间隔。正确实现 debouncing 的方法是将若干个函数调用 合成 一次,并在给定时间过去之后仅被调用一次。下面是一个原生 JavaScript 的实现,用到了作用域, 闭包, this, 和 计时事件:

// 将会包装事件的 debounce 函数function debounce(fn, delay) {
// 维护一个 timer
let timer = null;
// 能访问 timer 的闭包
return function() {
// 通过 ‘this’ 和 ‘arguments’ 获取函数的作用域和变量
let context = this;
let args = arguments;
// 如果事件被调用,清除 timer 然后重新设置 timer
clearTimeout(timer);
timer = setTimeout(function() {
fn.apply(context, args);
}, delay);
}}
这个函数 — 当传入一个事件(fn)时 — 会在经过给定的时间(delay)后执行。

文章目录
  1. 1.
|