当前位置:网站首页 > 技术博客 > 正文

防抖(手撕JavaScript防抖与节流)



防抖与节流是前端开发中常用的性能优化手段,本文将详细介绍防抖与节流的概念、应用场景、实现方式以及优缺点。

简单来说,防抖函数会推迟函数的执行,直到过了一定时间间隔后,函数被执行。如果在这个时间间隔内再次调用该函数,则重新计时。

  1. 搜索框输入联想 当用户输入搜索关键字时,不会立即发送请求,而是等待用户输入完成后再发送请求。
  2. 按钮提交事件 防止用户在短时间内多次点击提交按钮,导致多次提交表单。
  3. 浏览器窗口调整事件 当用户调整浏览器窗口大小时,不会立即触发 resize 事件,而是等待用户停止调整窗口大小后再触发。当然这种情况使用节流可能更合适,后文会详细介绍。
  1. 方法1: 使用setTimeout(推荐)
  1. 方法2: 使用时间戳

试着使用一下:

我们来设置一个场景,在没有防抖的情况下,鼠标划过一个元素,会打印:

使用防抖函数后:

鼠标不停滑动,不打印,停下1秒后打印。

如果我们希望在防抖函数中添加立即执行的功能,可以通过设置一个 参数来实现。

还是刚刚那个场景

当我们设置为时,鼠标第一次进入元素时会立即打印,之后的行为和普通防抖一样。 当设置的时间过去之后,我们再次划入元素,还是会立即打印,并且在无划动的情况下,1秒后再次打印。

  • 优点:防抖函数可以有效减少函数的执行次数,提高性能。
  • 缺点:如果函数需要立即执行,可能会导致延迟执行的问题,但是通过加强版防抖函数可以解决这个问题。

节流函数会限制函数的执行次数,确保函数在一定时间间隔内只执行一次。例如,如果设置一个 1000ms 的节流函数,那么在 1000ms 内,无论调用多少次,函数只会执行一次。

  1. 埋点上报 在用户滚动页面时,需要上报滚动位置,但是不希望频繁上报,可以使用节流函数。
  2. 拖拽事件 在拖拽元素时,需要频繁计算元素的位置,我们可以使用节流函数来减少计算次数,提高性能。
  1. 使用isThrottle标志
  1. 使用时间戳

鼠标不停滑动,1秒内只打印一次,非常好。 问题在于,当我们停下鼠标后,最后一次的不会打印,因为我们设置的是1秒内只执行一次。

比如在下面这个搜索框中,用户在0-1秒内输入了,在1-1.5秒内输入了和,之后停止了输入,我们就会丢失这个输入,因为它在第二个1秒内被忽略了。

加强版的节流加入了 的兜底功能,既能避免函数频繁调用,又能确保在用户停止操作后执行一次函数。

用户在秒输入,在秒输入和,之后停止输入,我们能够打印出。

防抖和节流是前端开发中常用的性能优化手段,可以有效减少函数的执行次数,提高性能。防抖函数会推迟函数的执行,直到过了一定时间间隔后,函数被执行;节流函数会限制函数的执行次数,确保函数在一定时间间隔内只执行一次。 加强版的防抖在原有的基础上增加了立即执行的功能,加强版的节流在原有的基础上增加了 的兜底功能,保证最后一次的执行。

版权声明


相关文章:

  • 黑客软件(黑客最常用的9款黑客工具(附工具分享))2024-11-03 01:37:05
  • 计数排序算法视频2024-11-03 01:37:05
  • vcenter(差异对比:VMware ESXi和vCenter和vSphere关系是怎样的?)2024-11-03 01:37:05
  • 网络调试助手([工具推荐]NetAssist网络调试助手)2024-11-03 01:37:05
  • c语言中函数已有主体2024-11-03 01:37:05
  • ubuntu如何添加用户2024-11-03 01:37:05
  • 变量命名规则 驼峰2024-11-03 01:37:05
  • qss(Qt Style Sheet(简称qss)的基本使用)2024-11-03 01:37:05
  • android 扫码二维码2024-11-03 01:37:05
  • scanf用法2024-11-03 01:37:05