防抖(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.scrollTopconsole.log(scrollTop,'scrollTop'); // 执行打印}window.onscroll = debounce(2000,scrollTop) // 页面滚动调用函数
节流(throttle)
我们可以设计一种类似控制阀门一样定期开放的函数,也就是让函数执行一次后,在某个时间段内暂时失效,过了这段时间后再重新激活
- 一段时间内的次数 变成一次
function throttling (timeout, fn) {let _playing = null // 定义一个变量return function () { // 返回一个函数let _arg = arguments // 接受实参if (_playing) { // 判断_playingreturn // 如果为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)
函数防抖的应用场景
连续的事件,只需触发一次回调的场景有:
