温故而知新,详细讲讲JavaScript的防抖与节流
一、概念
一句话概括 :JavaScript中的防抖(debounce)和节流(throttle)是用于控制函数执行频率的技术。
1.防抖
当一个事件连续触发时,防抖技术将只执行最后一次触发事件的函数调用。换句话说,只有在停止触发事件一段时间后,才会执行函数。(即:n秒后再执行该事件,若在n秒内被重复触发,则重新计时)
使用防抖的场景
搜索框输入联想:
用户在输入时,如果一直输入,会频繁触发搜索请求,使用防抖可以减少请求的次数,只在用户停止输入后才发送请求。
页面滚动加载更多:
当用户滚动页面时,会频繁触发加载更多数据的函数,使用防抖可以减少请求的次数,只在用户停止滚动后才发送请求。
防抖示例代码
function debounce(func, wait) {
let timeout;
return function() {
const context = this;
const args = arguments;
clearTimeout(timeout);
timeout = setTimeout(function() {
func.apply(context, args);
}, wait);
};
}
使用
const input = document.querySelector('input');
input.addEventListener('input', debounce(function() {
console.log('Input value:', input.value);
}, 200));
2.节流
当一个事件连续触发时,节流技术会限制函数的执行频率。换句话说,函数在一段时间内只会执行一次。(即:n秒内只运行一次,若在n秒内重复触发,只有一次生效)
使用节流的场景
页面滚动事件:
当用户滚动页面时,会触发滚动事件,如果不使用节流技术,可能会导致页面卡顿。使用节流可以限制滚动事件的触发频率,减少卡顿现象。
给按钮增加loading
在调用接口时触发loading加载效果,接口数据返回后关闭loading加载,期间点击按钮将不会重复触发函数执行
节流示例代码
function throttle(func, limit) {
let inThrottle;
return function() {
const context = this;
const args = arguments;
if (!inThrottle) {
func.apply(context, args);
inThrottle = true;
setTimeout(function() {
inThrottle = false;
}, limit);
}
};
}
使用
const input = document.querySelector('input');
input.addEventListener('input', throttle(function() {
console.log('Input value:', input.value);
}, 200));
总结
无论是防抖还是节流,都可以通过传递一个延迟时间参数来控制函数的执行频率。在实际应用中,根据具体需求选择使用防抖还是节流技术。
二、区别
防抖和节流都是用于控制函数执行频率的技术,但它们的实现方式和效果有一些区别
区别如下
触发时刻:
防抖:只有在事件停止触发一段时间后,才会执行函数。
节流:在一段时间内只会执行一次函数。
执行次数:
防抖:只会执行最后一次触发事件的函数调用。
节流:在一段时间内只会执行一次函数调用。
实现方式:
防抖:在事件触发后设置一个定时器,在定时器延迟时间内没有再次触发事件,则执行函数。
节流:在事件触发时设置一个定时器,在定时器延迟时间内触发事件则不执行函数。只有当定时器执行完毕后,才能再次触发执行函数。
使用场景:
防抖:适用于连续事件触发的情况,如搜索框输入、滚动加载更多等。
节流:适用于高频率事件触发的情况,如页面滚动、鼠标移动等。
根据具体的需求,选择使用防抖或节流技术可以有效地控制函数的执行频率,提升用户体验和性能。
如果还想了解其他关于js的知识,欢迎关注作者哦~
- 点赞
- 收藏
- 关注作者
评论(0)