当前位置:首页 > 技术分析 > 正文内容

JS 防抖、节流_js防抖和节流 区别及实现方式

ruisui883个月前 (02-20)技术分析9

防抖(Debounce)和节流(Throttle)是 JavaScript 中两种常见的性能优化技术,用于控制函数在一定时间内的执行频率。它们的核心目的是减少高频触发事件(如滚动、输入、窗口调整等)带来的性能问题,但它们的实现方式和适用场景有所不同。


1.防抖(Debounce)

防抖的核心思想是:在事件被触发后,等待一段时间再执行函数。如果在这段时间内事件再次被触发,则重新计时。

适用场景

  • 输入框实时搜索(等待用户停止输入后再发送请求)。
  • 窗口大小调整(等待用户停止调整后再计算布局)。
  • 按钮点击防止重复提交。

实现原理

  • 设置一个定时器,延迟执行函数。
  • 如果在延迟时间内事件再次触发,则清除之前的定时器并重新计时。

代码实现

function debounce(func, delay) {
  let timer;
  return function (...args) {
    clearTimeout(timer); // 清除之前的定时器
    timer = setTimeout(() => {
      func.apply(this, args); // 延迟执行
    }, delay);
  };
}

// 示例:输入框防抖
const input = document.querySelector('input');
input.addEventListener('input', debounce(() => {
  console.log('Input value:', input.value);
}, 300));

2.节流(Throttle)

节流的核心思想是:在一定时间间隔内,函数最多执行一次。无论事件触发多少次,函数都会按照固定的时间间隔执行。

适用场景

  • 滚动事件(每隔一段时间检查滚动位置)。
  • 鼠标移动事件(每隔一段时间更新鼠标位置)。
  • 游戏中的按键操作(限制操作频率)。

实现原理

  • 设置一个标志位(或时间戳),记录上一次函数执行的时间。
  • 如果当前时间与上一次执行时间的间隔大于设定的时间,则执行函数并更新标志位。

代码实现

function throttle(func, delay) {
  let lastTime = 0;
  return function (...args) {
    const now = Date.now();
    if (now - lastTime >= delay) {
      func.apply(this, args); // 执行函数
      lastTime = now; // 更新上一次执行时间
    }
  };
}

// 示例:滚动事件节流
window.addEventListener('scroll', throttle(() => {
  console.log('Scrolling...');
}, 300));

3.防抖和节流的区别

特性

防抖(Debounce)

节流(Throttle)

执行时机

事件停止触发后执行

按照固定时间间隔执行

触发频率

高频触发时只执行一次

高频触发时按固定频率执行

适用场景

输入框搜索、窗口调整

滚动事件、鼠标移动

代码实现

使用 setTimeout 和 clearTimeout

使用时间戳或标志位

是否立即执行

可以配置是否立即执行(前缘防抖)

通常不立即执行


4.结合防抖和节流

在某些场景下,可能需要结合防抖和节流的特性。例如,在滚动事件中,可以先使用节流确保函数按固定频率执行,再使用防抖确保在滚动停止后执行一次。

示例代码

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

function throttle(func, delay) {
  let lastTime = 0;
  return function (...args) {
    const now = Date.now();
    if (now - lastTime >= delay) {
      func.apply(this, args);
      lastTime = now;
    }
  };
}

// 结合防抖和节流
const combined = throttle(debounce(() => {
  console.log('Combined debounce and throttle');
}, 300), 100);

window.addEventListener('scroll', combined);

5.总结

  • 防抖:适合处理事件停止后的操作,例如输入框搜索。
  • 节流:适合处理高频触发但需要按固定频率执行的操作,例如滚动事件。
  • 根据具体场景选择合适的优化技术,可以有效提升性能和用户体验。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/2108.html

标签: 清除定时器
分享给朋友:

“JS 防抖、节流_js防抖和节流 区别及实现方式” 的相关文章

教培收费管理系统有哪些?

大部分培训机构走上正轨后,随着学员数量不断增长,各种业务和课程报名费用项目逐渐增多,如果还是采用传统的人工收费,就势必会出现算错账或收支对不上的问题。此时,再去查询哪里出了问题是一件非常难的事情。因此,很多培训机构都会使用机构收费系统。那培训机构收费系统有哪些呢?校宇宙是一款适合培训学校内部使用的信...

2024前端面试真题之—VUE篇

添加图片注释,不超过 140 字(可选)1.vue的生命周期有哪些及每个生命周期做了什么? beforeCreate是new Vue()之后触发的第一个钩子,在当前阶段data、methods、computed以及watch上的数据和方法都不能被访问。 created在实例创建完成后发生,当前阶段已...

学会使用Vue JSX,一车老干妈都是你的

作者:子君转发链接:https://mp.weixin.qq.com/s/eAOivpHeowLShfwPfW8-BA?君自前端来,应知前端事。需求时时变,bug改不完。?连续几篇文章,每篇都有女神,被老铁给吐槽了,今天不提了女神了,反正女神都是别人的(扎心了)。这两天小编看了腾讯与老干妈的事情,晚...

Gitlab概览

Gitlab是开源的基于Git的仓库管理系统,也可以管理软件开发的整个生命周期,是项目管理和代码托管平台,支撑着整个DevOps的生命周期。Gitlab很容易选为GitHub,作为公司私有库管理的工具。我们可以用Gitlab Workflow来协同整个团队的软件开发管理过程。软件开发阶段Gitlab...

使用cgroup限制进程资源

这里使用containerd项目中的cgroup包来实现进程资源限制。先写一个耗费一个CPU并且一秒增加10m内存的测试进程package mainimport ( "fmt" "math/rand" "time")func main() { go f...

2024最新版:前端性能优化方案汇总

前端训练营:1v1私教,终身辅导计划,帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~Hello,大家好,我是 Sunday。前端性能优化一直是很多同学非常关注的问题,在日常的面试中也是经常会被问到的点。所以今天咱们就花一点时间来了解一下2024最新的...