什么是防抖?如何实现?

动作绑定事件,动作发生后一定时间后触发事件,在这段时间内,如果该动作又发生,则重新等待一定时间再触发事件。

实现:每次触发事件时都取消之前的延时调用方法。

function debounce(fn) {
  let timer = null;
  return function() {
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, arguments)
    }, 500)
  };
}

什么是节流?如何实现?

动作发生后一段时间后触发事件,在这段时间内,如果动作又发生,则无视该动作,直到事件执行完后,才能重新触发。

实现:每次触发事件时都判断当前是否有等待执行的延时函数,如果有,则无视该次动作。

function throttle(fn) {
  let canRun = true; 
  return function() {
    if (!canRun) return;
    canRun = false; 
    setTimeout(() => { 
      fn.apply(this, arguments);
      canRun = true;
    }, 500);
  };
}

区别

防抖和节流的区别在于:

  • 防抖的思路是:指定事件触发的函数在一定时间后执行,如果在这段时间内再次触发该事件,那么便取消上一次的执行。
  • 节流的思路是:指定事件触发的函数在一定时间后执行,如果在这段时间内再次触发该事件,那么便无视该次事件动作。