首页 > 其他分享 >什么是防抖和节流?有什么区别?如何实现?

什么是防抖和节流?有什么区别?如何实现?

时间:2023-01-31 15:00:39浏览次数:30  
标签:function 触发 防抖 节流 什么 timer let


什么是防抖和节流?有什么区别?如何实现?

  • ​​什么是防抖和节流​​
  • ​​区别​​
  • ​​为什么要有防抖和节流​​
  • ​​应用场景​​
  • ​​JavaScript 中的实现方式​​

什么是防抖和节流

  • 防抖

n 秒后在执行该事件,若在 n 秒内被重复触发,则重新计时。

  • 节流

n 秒内只运行一次,若在 n 秒内重复触发,只有一次生效。

区别

在​​单位时间内​​内疯狂点击一个按钮,如果使用了防抖则会只执行一次,而你使用了节流则会每隔一段时间执行一次,这个时间可以自己来掌控。

为什么要有防抖和节流

本质上是优化高频率执行代码的一种手段:
如:浏览器的 ​​​resize​​​、​​scroll​​​、​​keypress​​​、​​mousemove​​​ 等事件在触发时,会不断地调用绑定在事件上的回调函数,极大地浪费资源,降低前端性能。

为了优化体验,需要对这类事件进行调用次数的限制,对此我们就可以采用 防抖(debounce)节流(throttle) 的方式来减少调用频率。

应用场景

防抖 在连续的事件,只需触发一次回调的场景有:
  搜索框搜索输入。只需用户最后一次输入完,再发送请求;
  手机号、邮箱验证输入检测;
  窗口大小resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。

节流 在间隔一段时间执行一次回调的场景有:
  滚动加载,加载更多或滚到底部监听;
  搜索框,搜索联想功能。

JavaScript 中的实现方式

这里使用闭包的方式来实现 防抖 和 节流,注意使用 ​​apply()​​​ 函数来调整 ​​this​​ 的指向。

<!DOCTYPE html>
<html lang="zh-cn">

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>防抖&节流</title>
</head>

<body>
<div>
<div>
<label>防抖</label>
</div>
<button id="add">防抖加法器</button>
<label id="count">真实触发了0次</label>
</div>

<div style="margin-top: 20px;">
<div>
<label>节流</label>
</div>
<button id="throttleAdd">节流加法器</button>
<label id="throttleCount">真实触发了0次</label>
</div>

<script lang="js">
/* 防抖 */
let addBtn = document.getElementById("add");
let count = document.getElementById("count");
let n = 0;

function addOne() {
n = n + 1;
count.innerHTML = `真实触发了${n}次`;
}

function debounce(fun, time) {
let timer;
return function () {
clearTimeout(timer);
timer = setTimeout(() => {
fun.apply(this, arguments);
}, time);
};
}

addBtn.addEventListener("click", debounce(addOne, 2000));

/* 节流 */
let throttleAddBtn = document.getElementById("throttleAdd");
let throttleCount = document.getElementById("throttleCount");
let m = 0;

function addThrottl() {
m = m + 1;
throttleCount.innerHTML = `真实触发了${m}次`;
}

function throttle(fun, time) {
let timer = 0;
return function () {
let currentTime = new Date();
if (currentTime - timer > time) {
fun.apply(this, arguments);
timer = currentTime;
}
};
}

throttleAddBtn.addEventListener("click", throttle(addThrottl, 2000));
</script>
</body>

</html>


标签:function,触发,防抖,节流,什么,timer,let
From: https://blog.51cto.com/u_14316538/6029340

相关文章

  • 什么是rpx
    什么是rpx kkguai 关注 0.1 2020.05.0220:47 字数136 阅读17723评论0喜欢2rpx:是微信小程序独有的,解决屏幕自适应的尺寸单位可以根据屏幕宽度进行自适......
  • java为什么要使用静态内部类
    参考:https://blog.csdn.net/fengyuyeguirenenen/article/details/122696650static内部类意味着:(1)为创建一个static内部类的对象,我们不需要一个外部类对象。(2)不能从......
  • 为什么reids是单线程
    我们首先要明白,reids很快,官方表示,因为reids是基于内存的操作,cpu不是reids的瓶颈,redis的瓶颈有可能是机器内存的大小或者网络带宽,既然单线程容易控制,而且cpu不会成为瓶颈,所......
  • 全网影视免费看,最新电影、电视剧免广告免VIP观看,只要你能搜到的,统统都能看,《狂飙》、
    最近我在看的,而且感觉很火的两个电视剧《狂飙》和《三体》正在持续更新中,怎么能最快追到最新剧集呢?如果特别喜欢,想支持一下当然可以开影视会员啦,如果想白嫖一下也不是没有......
  • PEG parser——为什么python不再使用LL(1)
    Python3.9中的PEG语法分析算法0题外话若文章有后续更新,可以在我的博客上看到。pre视频在这里。1PEG:ParsingExpressionGrammar1.1定义1.1.1语法形式上,......
  • 微信小程序防抖
    微信小程序闭包-防抖这里主要用到闭包,将函数内的值保存下来,下次点击的时候进入判断,如果定时器启动了,则清除定时器,直到最后一次启动定时器,也就是说,在规定的时间内只会触发......
  • 为什么vue3要使用ref
    vue3中使用ref来创建响应式数据,让习惯了选项式API的我很不习惯。因为得使用xxx.value来读写响应式数据,没有vue2中直接使用this.xxx来读写简洁。vue3这样设计的原因是原生J......
  • 客户至上意味着什么?——与Edgio首席客户官Peter Gallagher访谈
    点击关注负责这项工作的是我们的首席客户官PeterGallagher。我们最近与Peter坐下来讨论了客户至上对他意味着什么,以及什么能够助力他的客户服务事业。Peter还分享了持......
  • 同样品牌的SSL证书,在官网买和在国内代理品牌买有什么区别?
    简而言之,还是地区特色的原因导致一些区别。任何个人或者企业绝对都是可以去品牌SSL证书的官网购买到证书的,但是能不能买到、买到后好不好用,就是另一回事了。我曾尝试购买一......
  • python的split函数切分字符串时为什么会产生空字符串
    群里的一个小伙伴提了一个问题,他使用split函数切分字符串得到的结果里有空字符串,他对空字符串的出现感到困惑不解。text='1aa2'print(text.split('a'))#['1','',......