Js 防抖与节流
地灵 人气:1
## Js 防抖与节流
【概述】防抖和节流算性能优化的知识,所以记录下防抖与节流,从概念、使用场景到代码的简单实现。
比如:监听滚动,基本每个网站都会有返回顶部的按钮,当用户下拉到一定高度时,会出现返回顶部按钮。那我们现在写一下这个功能代码如下:
```
function showTop() {
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
console.log('滚动条位置:' + scrollTop);
}
window.onscroll = showTop
// 滚动一下会执行 n次
```
但是当你用鼠标滚轮进行滚动时,你会发现~~轻轻~~滚动一下,该函数会执行相当多的次数,有时候我们并不需要执行这么多的次数,只需一次即可,所以接下来是如何优化这个功能。
#### 防抖
我们可以提供一种思路,在第一次触发事件时,不立即执行函数,而是给出一个时间 500ms:如果 500ms 内没有再次触发滚动事件,那么就执行函数。如果在 500ms 内再次触发滚动事件,那么当前的计时取消,重新开始计时。代码如下:
```
/*
* fn [function] 需要防抖的函数
* delay [number] 毫秒,防抖期限值
*/
function debounce(fn, delay) {
let timer = null; // 定义空变量
return function () {
if (timer) {
clearTimeout(timer);
// 说明当前正在计时,并且又触发了相同事件,所以清除当前计时器。
}
timer = setTimeout(fn, delay); // 反之则启动。
}
}
// 结合滚动函数
window.onscroll = debounce(showTop, 1000)
```
此时函数会在1秒后执行,以上就是简单的防抖,对于短时间内多次触发的事件,让它在规定时间内只触发一次。
#### 节流
如果用户不停的滚动鼠标滚轮,那么事件就永远不会触发,所以问题又出来了。
我们可以设计一个开关,函数执行一次后,在某个时间段内失效,过了这段时间再开启。
```
function throttle(fn, delay) {
let flag = true
return function () {
if (!flag) {
// 关
return false
}
// 开,执行函数并且在间隔期内把状态位设为无效
flag = false
setTimeout(() => {
fn()
flag = true;
}, delay)
}
}
// 结合滚动函数
window.onscroll = throttle(showTop, 1000)
```
至此当用户持续滚动时,函数任会以1秒时间间隔来运行。
区别:中括号法可以用变量作为属性名,而点方法不可以。
中括号法可以用数字作为属性名,而点语法不可以。
#### 其他场景
比如用户搜索内容 input 事件,支持实时搜索就可以用节流,还有页面响应式大小 resize 适配大小屏,这种情况可以使用防抖,只需判断最后一次的变化值。
#### 总结
以上内容基于防抖和节流的核心思实现了简单的代码,具体的情况还要看业务逻辑。如参数传递,作用域改变等。
see you ~~
加载全部内容