js之debounce和throttle

166 阅读1分钟

滑动时处理onmousemove事件
debounce函数做的事情是:强制一个函数在某个连续的时间段内只执行一次,哪怕它会被调用多次,在停止操作一段时间后再调用,而不是在用户操作的过程当中,浏览器触发多少次事件,就执行多少次监听函数。例如:在每3s时间段内连续的移动了鼠标,浏览器可能触发几十甚至几百个mouvemove事件不使用devounce,监听函数就执行多次,如果对监听函数使用100ms的去弹跳,那么浏览器只会执行一次这个监听函数,而且是在3.1s执行,
function debounce(fn, delay) {

// 定时器,用来 setTimeout
var timer

// 返回一个函数,这个函数会在一个时间区间结束后的 delay 毫秒时执行 fn 函数
return function () {

// 保存函数调用时的上下文和参数,传递给 fn
var context = this
var args = arguments

// 每次这个返回的函数被调用,就清除定时器,以保证不执行 fn
clearTimeout(timer)

// 当返回的函数被最后一次调用后(也就是用户停止了某个连续的操作),
// 再过 delay 毫秒就执行 fn
timer = setTimeout(function () {
  fn.apply(context, args)
}, delay)

}
}