防抖与节流:两者区别、各自作用、示例代码

还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技术开发,欢迎加底部微信(gis-dajianshi),一起交流。

在这里插入图片描述

No.大剑师精品GIS教程推荐
0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】
1Openlayers 【入门教程】 - 【源代码+示例 300+】
2Leaflet 【入门教程】 - 【源代码+图文示例 150+】
3MapboxGL【入门教程】 - 【源代码+图文示例150+】
4Cesium 【入门教程】 - 【源代码+综合教程 200+】
5threejs【中文API】 - 【源代码+图文示例200+】
6Shader 编程 【图文示例 100+】
7Geoserver 【配置教程 100+】
8卫星应用开发教程 【配置+应用教程 100+】
9GIS数字孪生与大模型 【应用实战 100+】
10报表与数字大屏 【Echarts 实战示例】 - 【D3 综合教程】 - 【其他大屏】


两者用途

防抖(Debounce)和节流(Throttle)是前端开发中常用的两种性能优化手段,主要用于限制频繁触发的事件回调函数的执行频率,避免过度渲染、频繁网络请求等问题,从而提高用户体验和节约系统资源。

在这里插入图片描述

防抖(Debounce)

防抖的核心思想是,当事件被快速连续触发时,仅在事件停止触发并等待一段时间后才执行回调函数。如果在这段等待期间又有新的触发发生,则重新开始等待。简而言之,防抖确保了一段时间内的最后一次操作会被执行。

JavaScript防抖函数示例:

function debounce(func, delay) {
  let timeoutId;

  return function(...args) {
    if (timeoutId) {
      clearTimeout(timeoutId);
    }
    timeoutId = setTimeout(() => {
      func.apply(this, args);
      timeoutId = null;
    }, delay);
  };
}

// 使用示例:
const inputElement = document.getElementById('searchInput');
const search = debounce((event) => {
  console.log('Searching for:', event.target.value);
  // 这里是发起搜索请求的实际逻辑...
}, 300); // 延迟300毫秒

inputElement.addEventListener('input', search);

在这个示例中,当用户在搜索框中快速输入时,search函数不会立即执行,而是等待用户停止输入(即在300毫秒内不再有新的输入事件)后才会真正发起搜索请求。

节流(Throttle)

节流则是指允许函数在一个固定的时间间隔内只执行一次,即使在这段时间内多次触发事件。 这样可以保证事件回调至少每隔一定时间执行一次,而不是连续执行。

JavaScript节流函数示例:

function throttle(func, limit) {
  let lastExecution = 0;

  return function(...args) {
    const now = Date.now();
    if (now - lastExecution >= limit) {
      func.apply(this, args);
      lastExecution = now;
    }
  };
}

// 使用示例:
const scrollHandler = throttle(() => {
  console.log('Scrolled!');
  // 这里是处理滚动事件的实际逻辑...
}, 200); // 每隔200毫秒最多执行一次

window.addEventListener('scroll', scrollHandler);

在这个示例中,即使用户快速滚动页面,scrollHandler函数也会保持每200毫秒执行一次,而不是随着滚动事件的每一次触发都执行,从而避免了过于频繁的计算和渲染。

评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是大剑师兰特

打赏一杯可口可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值