防抖和节流

78 阅读1分钟

防抖和节流的区别

防抖:n秒执行一次函数,如果n秒内再次执行,那么这个n秒重新计时

节流:连续执行函数,但是n秒内只执行一次

防抖

在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。

场景:有一个输入框,输入之后才会调用接口获取联想词。但是,因为频繁调用接口不太好,所以在代码中使用防抖功能,只有在用户输入完毕的一段时间后,才会调用接口出现联想词

手撕防抖

// 这是一个点击增加按钮
<body>
    <button id="add">点击+1</button>
    <script>
        let addBtn = document.getElementById('add')
        let count = 0
        function addOne() {
            count++
            console.log(count)
        }

        function debounce(fn, time) {
            let timer
            return function () {
                clearTimeout(timer)
                timer = setTimeout(() => {
                    fn.apply(this, arguments)
                }, time);
            }
        }
        addBtn.addEventListener('click', debounce(addOne, 2000))
    </script>
</body>

节流

规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。

场景:监控鼠标滚轮,监听滚动条位置,防止按钮多次点击

手写节流

function scrollTest() {
    console.log('被触发了')
}
function throttle(fn, time) {
    let t1 = 0 // 初始时间
    return function () {
        let t2 = new Date() //当前时间
        if (t2 - t1 > time){
            fn.apply(this, arguments)
            t1 = t2
        }
            
    }
}

document.addEventListener('scroll', throttle(scrollTest, 3000))