函数的防抖和节流

297 阅读1分钟

昨天坐公交,人刚上完,一jio油门,我就摔了跤,我很生气。这件事让我回想起了上次看到的关于防抖的文章,现在自己再来说一遍,也算是加深认识吧。

防抖

什么是防抖,举个司机踩油门的栗子就是,每次有有乘客上来司机要等10秒让乘客坐稳了才能开车,有新的乘客上来又要重新计算十秒,直到最后一个乘客上来为止。拿个程序员常见的例子就是搜索框,每次输入暂停了超过一定时间才会去向服务器发送搜索请求。

function debounce(fn, time) {
    let Timer;
    return () => {
        Timer && clearTimeout(Timer)
        Timer = setTimeout(() => {
            fn.call(this, arguments)
        }, time)
    }
}

应用:

function debounce(fn, time) {
    let Timer;
    return () => {
        Timer && clearTimeout(Timer)
        Timer = setTimeout(() => {
            fn.apply(this, arguments)
        }, time)
    }
}

let input = document.querySelector('#input')

input.addEventListener('keyup', debounce(() => {
    console.log(input.value)
},500))

节流

顾名思义就是指一段时间内只会执行一次事件,也就是没两次事件执行的间隔大于等于所给定的时间。例如使用鼠标疯狂点击的时候,需要限制点击事件的触发频率。

function throttle(fn, time) {
    let startTime = new Date()
    return () => {
        let now = new Date()
        if(now - startTime >= time){
            fn.apply(this, arguments)
            startTime = new Date()
        }
    }
}

应用:

function throttle(fn, time) {
    let startTime = new Date()
    return () => {
        let now = new Date()
        if(now - startTime >= time){
            fn.apply(this, arguments)
            startTime = new Date()
        }
    }
}

let button = document.querySelector('#button')

button.addEventListener('click', throttle(() => {
    console.log(new Date())
}, 1000))

参考