返回

防抖和节流:优化前端性能的利器

前端

1. 防抖和节流的概念

防抖(debounce) 是指在一段时间内,只有当连续触发的事件停止一段时间后,才会执行函数。

节流(throttle) 是指在一段时间内,函数只能执行一次,即使在该时间段内触发了多次事件。

2. 防抖和节流的原理

防抖原理

防抖函数会创建一个定时器,当事件触发时,定时器会重新开始计时。如果在定时器结束之前事件再次触发,定时器就会被重置。只有当定时器结束时,函数才会被执行。

节流原理

节流函数会创建一个标记,用于跟踪函数是否正在执行。当事件触发时,如果标记为false,则函数将被执行,并将标记设置为true。当函数执行完毕后,标记将被重置为false。如果在函数执行期间再次触发事件,函数将不会被执行,直到标记被重置为false。

3. 防抖和节流的实现方法

防抖实现方法

function debounce(func, wait) {
  let timer;
  return function() {
    let context = this;
    let args = arguments;
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      func.apply(context, args);
    }, wait);
  };
}

节流实现方法

function throttle(func, wait) {
  let lastCallTime = 0;
  return function() {
    let context = this;
    let args = arguments;
    let now = new Date().getTime();
    if (now - lastCallTime < wait) {
      return;
    }
    lastCallTime = now;
    func.apply(context, args);
  };
}

4. 防抖和节流的应用场景

防抖的应用场景

  • 搜索框输入:当用户在搜索框中输入时,防抖可以防止搜索请求过于频繁,从而减少服务器压力。
  • 表单验证:当用户输入表单时,防抖可以防止表单验证过于频繁,从而提高用户体验。
  • 滚动事件处理:当用户滚动页面时,防抖可以防止滚动事件过于频繁,从而提高页面性能。

节流的应用场景

  • 窗口大小改变事件处理:当窗口大小改变时,节流可以防止窗口大小改变事件过于频繁,从而提高页面性能。
  • 鼠标移动事件处理:当鼠标移动时,节流可以防止鼠标移动事件过于频繁,从而提高页面性能。
  • 键盘事件处理:当键盘按下时,节流可以防止键盘事件过于频繁,从而提高页面性能。