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

(前端必会)快速理解节流和防抖(节流和防抖的应用场景)

ruisui881个月前 (05-08)技术分析13

1、什么是节流和防抖?

节流(throttle):节流可以控制事件触发的频率,节流就跟小水管一样,如果不加节流的话,水就会哗啦啦啦啦啦啦的流出来,但是一旦加了节流阀,你就可以自己控制水的流速了,加了节流后水可以从哗啦啦啦变成滴答滴答滴答,放到我们的函数事件里面说就是可以让事件触发变慢,比如说事件触发可以让它在每一秒内只触发一次;

防抖(debounce):防抖就是可以限制事件在一定时间内不能多次触发,比如说你疯狂按点击按钮,一顿操作猛如虎,不加防抖的话它也会跟着你疯起来,疯狂执行触发的方法。但是一旦加了防抖,无论你点击多少次,他都只会在你最后一次点击的时候才执行;

下面让我们看看如何封装一下节流和防抖的函数,下面的代码可以直接复制使用,节流和防抖是结合在一起的,当然,你也可以将他们拆分开来用

2、自己封装一个节流和防抖结合的函数

function debounce(fn, wait = 50, isDebounce = true){
	if(isDebounce){
	//初始化一个定时器
		let timer
		return function() {
			//如果timer存在就将其清除
			if(timer){
			clearTimeout(timer)
			}
			//重置timer
			timer = setTimeout(()=>{
			//将这里的this指向和事件绑定回原方法
			fn.apply(this,arguments)
			}, wait)
		}
	}else{
		//如果isDebounce为false则返回这里的throttle方法
		let prev = new Date()
		return function() {
			let now = new Date()
			/*当下一次事件触发的时间和初始事件触发的时间的差值大于
			等待时间时才继续触发新事件 */		   
			if(now - prev > wait){
			fn.apply(this, arguments)
			//重置初始触发时间
			prev = new Date()
			}
		}
	}
}

3、让我们测试一下

这段代码也可以直接复制到你们的编译器去进行测试,测试结果我就不贴出来了

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<style>
  body {
    height: 3000px;
  }
</style>

<body>

</body>
<script>
function debounce(fn, wait = 50, isDebounce = true){
	if(isDebounce){
		let timer
		return function() {
			if(timer){
			clearTimeout(timer)
			}
			timer = setTimeout(()=>{
			fn.apply(this,arguments)
			}, wait)
		}
	}else{
		let prev = new Date()
		return function() {
			let now = new Date()   
			if(now - prev > wait){
			fn.apply(this, arguments)
			prev = new Date()
			}
		}
	}
}

//用来测试的函数
function test() {
  console.log("test")
}

//我们用页面滚动事件来做测试
//第三个参数为true或者不传参则为防抖方法,传false则为节流方法
window.addEventListener('scroll', debounce(test, 500, true));

</script>
</html>


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

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

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

标签: js 防抖函数
分享给朋友:

“(前端必会)快速理解节流和防抖(节流和防抖的应用场景)” 的相关文章

gitlab 分支保护设置

一、功能描述代码管理中管理,我们把稳定的分支设置为保护,可以防止其他人员误操作(例如删除,合并,推送代码等)。二、Gitlab配置步骤1 点击项目Repository标签2.点击Expand标签3.配置如下:默认master是被保护的,而且只有维护人员具有推送和合并权限。设置保护分支,这里的beta...

身体越柔软越好?刻苦拉伸可能反而不健康 | 果断练

坐下伸直膝盖,双手用力向前伸,再用力……比昨天前进了一厘米,又进步了! 这么努力地拉伸,每个人都有自己的目标,也许是身体健康、线条柔美、放松肌肉、体测满分,也可能为了随时劈个叉,享受一片惊呼。 不过,身体柔软,可以享受到灵活的福利,也可能付出不稳定的代价,并不是越刻苦拉伸越好。太硬或者太软,都不安全...

vue打开新窗口并且实现传参,有图有真相

我要实现的功能是打开一个新窗口用来展示新页面,而且需要传参数,并且参数不能显示在地址栏里面,而且当我刷新页面的时候,传过来的参数不能丢失,要一直存在,除非我手动关闭这个新窗口,即浏览器的标签页。通过面向百度编程,发现网上的根本达不到这个效果,而且还都是坑,明明实现不了,还若有其事的写出来,于是我在标...

精品微信小程序在线考试系统+后台管理系统|前后...

《微信小程序在线考试系统+后台管理系统|前后分离VUE》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等本系统包含微信小程序前台和Java做的后台管理系统,该后台采用前后台前后分离的形式使用Java+VUE微信小程序——前台涉及技术:WXML 和 WXSS、JavaScript...

Firefox正针对Vue.js进行优化,下版本响应速度将“显著提升”

IT之家 9 月 7 日消息,据 Mozilla 官方博客发文显示,Firefox 浏览器正针对 Vue.js 进行优化,此前 FireFox 浏览器在面向 Vue 3 时遇到了一些性能问题。▲ 图源 Mozilla 官方博客目前开发人员已经对此进行了解决,在 Firefox 118 内部版本中进行...

企业微信自建应用和消息发送配置对接系统指南

本文介绍企业微信应用创建、消息提醒、自动回复、自定义菜单和服务端接口对接过程。企业微信登录:https://work.weixin.qq.com/企业微信接口对接,应用授权和发送消息代码:https://www.easywechat.com/docs/5.x/wework/oauth一、创建自建应用...