跳到主要内容

手写防抖、节流,防抖和节流的区别 ?

参考答案:

防抖和节流是两种常用的编程技术,用于优化高频率执行代码,减少调用的频率,从而提高性能。

防抖(Debounce)的原理是在事件被触发n秒后再执行回调函数,如果在这n秒内又被触发,那么会重新计时。这意味着,在连续触发事件的情况下,只有最后一次触发的事件会执行回调函数,前面的触发都会被忽略。防抖通常用于输入框等需要判断用户输入完毕后再执行的操作,例如手机号、邮箱等输入框的验证。

节流(Throttle)的原理是在一段时间内只执行一次事件回调函数,如果在这段时间内事件又被触发了,则忽略该事件。这意味着,在连续触发事件的情况下,会保证在规定时间内一定会执行一次回调函数。节流通常用于需要限制执行频率的场景,例如搜索联想功能,避免用户频繁输入导致请求过多。

手写防抖和节流的示例代码如下:

防抖(Debounce):

function debounce(fn, delay) {
  let timer = null;
  return function() {
    let context = this;
    let args = arguments;
    if (timer) {
      clearTimeout(timer);
      timer = null;
    }
    timer = setTimeout(function() {
      fn.apply(context, args);
    }, delay);
  };
}

节流(Throttle):

function throttle(fn, delay) {
  let lastTime = 0;
  return function() {
    let nowTime = Date.now();
    if (nowTime - lastTime > delay) {
      lastTime = nowTime;
      fn.apply(this, arguments);
    }
  };
}

这两种技术的主要区别在于,防抖会忽略所有除了最后一次触发的事件,而节流则会保证在规定时间内一定会执行一次回调函数。因此,它们适用于不同的场景,需要根据具体需求进行选择。