1. 防抖
事件频繁触发后的 n 秒内函数只会执行一次,如果 n 秒内高频事件再次被触发,则重新计算时间
应用场景
- 输入框中频繁的输入内容,搜索或者提交信息
- 频繁的点击按钮,触发某个事件
- 监听浏览器滚动事件,完成某些特定操作
- 用户缩放浏览器的resize事件
2.节流
事件频繁触发,但在n秒内只执行一次函数,不管在这个中间有多少次触发这个事件
应用场景
- 监听页面的滚动事件
- 鼠标移动事件
- 用户频繁点击按钮操作
- 游戏中的一些设计
3.相似点
防抖和节流都是为了当事件频繁触发时,能够控制函数执行的频率以防止前端性能下降或对服务器造成压力4.区别
节流在一定时间内会触发函数,而防抖仅在最后一次触发5.手写防抖
// 防抖
function debounce(fn, delay) {
// 1.定义一个定时器,保存上次的定时器
let timer = null
// 触发事件的时候 会将回调函数的this绑定到元素上,并传入event事件对象
// 2.真正执行的函数
return function (...args) {
// 取消上次的定时器
if (timer) clearTimeout(timer)
// 延迟执行
timer = setTimeout(() => {
// 外部传入的真正要执行的函数
fn.apply(this, args)
timer = null
}, delay)
}
}
6.手写节流
```javascript // 节流 // 定时器实现 function throttle(fn, delay) { // 1.定义一个定时器 let timer = null return function (…args) { // 2.如果有定时器则return if (timer) return timer = setTimeout(() => { // 3.定时器执行完毕后,将timer设置为null,即可再次进行下一次执行 fn.apply(this, args) timer = null }, delay) } }
// 时间戳实现 function throttle(fn, delay) { let last = 0 return function (…args) { const now = Date.now() if(now - last > delay) { last = now fn.apply(this, args) } } }
```