防抖(debounce)
- 对于短时间内连续触发的事件(比如滚动事件),防抖的含义就是让某个时间期限(如上面的1000毫秒)内,事件处理函数只执行一次。
- 如果短时间内大量触发同一事件,只会执行一次函数。
多次成一次
function debounce (timeout, fn) { // 接受延迟时间,函数
let _time = null // 定义一个变量
return function () { // 套用闭包 当debounce函数第一次被调用时 直接返回改函数 考虑维护全局纯净 使用闭包
clearTimeout(_time) // 清楚定时器
_time = setTimeout(() => { // 给_time变量赋值为一个定时器
fn.apply(this) // 使用apply调用fn函数
}, timeout) // setimeout的延迟调用时间
}
}
function scrollTop(){
let scrollTop = document.documentElement.scrollTop
console.log(scrollTop,'scrollTop'); // 执行打印
}
window.onscroll = debounce(2000,scrollTop) // 页面滚动调用函数
节流(throttle)
我们可以设计一种类似控制阀门一样定期开放的函数,也就是让函数执行一次后,在某个时间段内暂时失效,过了这段时间后再重新激活
- 一段时间内的次数 变成一次
function throttling (timeout, fn) {
let _playing = null // 定义一个变量
return function () { // 返回一个函数
let _arg = arguments // 接受实参
if (_playing) { // 判断_playing
return // 如果为true 终止函数执行 直接return
}
_playing = true // 赋值变量
setTimeout(() => { // 定时器
fn.apply(this, _arg) // 更改this指向 并且执行代码
_playing = false // 赋值变量
}, timeout) // 定时器时间
}
}
function btn_click(){
console.log('1');
}
btn.onclick = throttling(1000, btn_click)
函数防抖的应用场景
连续的事件,只需触发一次回调的场景有: