js防抖debounce和节流throttling详解

0、前言

防抖和节流对于我们前端的性能优化上来说是一个必不可少的部分,也是面试出现频率极高的问题。本文将从防抖节流概念开始,到具体实现的代码解析,一步一步讲述如何实现防抖节流。

1、防抖(debounce)

1.1 概念

所谓防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。

1.2 实现思路

在这里插入图片描述
思路:事件触发后开启一个定时器,如果事件在这个定时器限定的时间内再次触发,则清除定时器,在写一个定时器,定时时间到则触发。

function debounce(fn, t=500){
	let timer;
	return function(){
		// 如果有定时器,先清除
		if(timer) clearTimeout(timer);
		// 开启定时器
		timer = setTimeout(()=> {
			fn.apply(this, arguments);
		}, t)
	}
}

2、节流(throttle)

2.1 概念

所谓节流,就是指连续触发事件但是在 n 秒中只执行一次函数。

2.2 实现思路

在这里插入图片描述
思路:我们可以设计一种类似控制阀门一样定期开放的函数,事件触发时让函数执行一次,然后关闭这个阀门,过了一段时间后再将这个阀门打开,再次触发事件。

function throttle(fn, t=500) {
	let startTime = 0;
	return function() {
		let now = Date.now();
		if(now - startTime >= t) {
			fn();
			startTime = now;
		}
	}
}

3、总结

  1. 防抖和节流相同点:

防抖节流都是为了阻止操作高频触发,从而浪费性能。

  1. 防抖和节流区别:

防抖是触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。适用于可以多次触发但触发只生效最后一次的场景。

节流是高频事件触发,但在n秒内只会执行一次,如果n秒内触发多次函数,只有一次生效,节流会稀释函数的执行频率。

  1. 使用场景

防抖: input框搜索联想词、登录、点击按钮提交表单…
节流: scroll滑动事件、resize浏览器窗口改变事件、mousemove鼠标移动事件、文档编辑隔一段时间自动保存…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

前端~初学者

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值