防抖节流
- 函数防抖和函数节流都是防止某一时间频繁触发,但是这两兄弟之间的特性却不一样。
- search搜索联想,用户在不断输入值时,用防抖来节约请求资源。
- window触发resize的时候,不断的调整浏览器窗口大小会不断的触发这个事件,用防抖来让其只触发一次
- 函数防抖是某一段时间内只执行一次,而函数节流是间隔时间执行。
- 鼠标不断点击触发,mousedown(单位时间内只触发一次)
- 监听滚动事件,比如是否滑到底部自动加载更多,用throttle来判断
函数防抖的实现原理:
概念: 在事件被触发n秒后再执行,如果在这n秒内又被触发,则重新计时。
生活中的实例: 如果有人进电梯(触发事件),那电梯将在10秒钟后出发(执行事件监听器),这时如果又有人进电梯了(在10秒内再次触发该事件),我们又得等10秒再出发(重新计时)。
function fn (foo) {
console.log('hello', foo)
}
const newFn = debounce(fn, 1000)
// 计时 1s
newFn(123)
// 如果在 1s 之内重新调用
// 先把之前的废除
// 重新计时
newFn('world')
// newFn()
function debounce (callback, time) {
let timer = null
// 函数参数中的 ... 表示接收剩余参数
// 它会把所有的参数收集到一个数组中
return function (...args) {
console.log(args)
window.clearTimeout(timer)
timer = setTimeout(() => {
// 这里的 ... 表示数组展示操作符
// args[0], args[1], args[2] .........
callback(...args)
}, time)
}
}
函数节流(Throttle)
概念: 规定一个单位时间,在这个单位时间内,只能有一次触发事件的回调函数执行,如果在同一个单位时间内某事件被触发多次,只有一次能生效。
生活中的例子:函数节流就是开枪游戏的射速,就算一直按着鼠标射击,也只会在规定射速内射出子弹。
函数节流实现原理
function throttle(callback, interval) {
// 最后一次的调用时间
let lastTime = 0
// 定时器
let timer = null
// 返回一个函数
return function () {
// 清除定时器
clearTimeout(timer)
// 当前最新时间
let nowTime = Date.now()
// 如果当前最新时间 - 上一次时间 >= 时间间隔
// 或者没有上一次时间,那就立即调用
if (nowTime - lastTime >= interval) {
callback()
// 记录最后一次的调用时间
// 1
lastTime = nowTime
} else {
timer = setTimeout(() => {
callback()
}, interval)
}
}
}
const fn = throttle(函数, 1000)