前端面试题——防抖和节流(一)

主要来看一下面试经常被问道的防抖节流

1.防抖

防抖在我理解来其实就是事件触发时在n秒后调用事件绑定的方法,如果n秒内再次触发这个事件,那么重新计时。
下面以浏览器的滚动条为例,如果有这样一个需求 :我需要监听用户浏览器的滚动事件,返回用户距离顶部的距离,那么可以用一下代码实现:

function showTop() {
        let scollTop = document.body.scrollTop || document.documentElement.scrollTop
        console.log(scollTop);
    }
    window.onscroll = showTop

但是这样做会带来一个问题,就是只要滚动条发生一点点变化:
前端面试题——防抖和节流(一)
意思就是打印的太过频繁,如果此时有一些比较复杂的操作,对于页面性能来说会造成很多不必要的开销。那么我们能不能实现这样的一个功能:在第一次触发事件时,不要立马触发函数,而是进行一个n秒的延迟(n可以根据需求进行调整),如果n秒内没有再次触发事件,就执行函数,如果n秒内我又一次的触发的滚动事件,那么取消掉上一次的事件操作,重新计时,这样子我们就可以避免没有必要的消耗。
因为需要一个变量来保存时间,但是为了防止全局变量污染,我们使用闭包来解决这个问题。

 	function showTop() {
        let scollTop = document.body.scrollTop || document.documentElement.scrollTop
        console.log(scollTop);
    }
	function debounce(fn, delay) {
        let timer = null
        return function () {
            if (timer) {
                clearInterval(timer)
            }
            timer = setTimeout(fn, delay);
        }
    }
    window.onscroll = throttle(showTop, 500)
上一篇:vue插件——滚动监听 vue-scrollwatch


下一篇:Python-numpy.where() 用法