JS的节流、函数防抖 原理及使用场景

函数防抖(debounce)

//模拟一段ajax请求

function ajax(content) {

  console.log('ajax request ' + content)

}

let inputa = document.getElementById('unDebounce')

inputa.addEventListener('keyup', function (e) {

    ajax(e.target.value)

})

可以看到,我们只要按下键盘,就会触发这次ajax请求。不仅从资源上来说是很浪费的行为,而且实际应用中,用户也是输出完整的字符后,才会请求。下面我们优化一下:

//模拟一段ajax请求

function ajax(content) {

  console.log('ajax request ' + content)

}

function debounce(fun, delay) {

    return function (args) {

        let that = this

        let _args = args

        clearTimeout(fun.id)

        fun.id = setTimeout(function () {

            fun.call(that, _args)

        }, delay)

    }

}



let inputb = document.getElementById('debounce')

let debounceAjax = debounce(ajax, 500)

inputb.addEventListener('keyup', function (e) {

        debounceAjax(e.target.value)

    })

函数节流(throttle)

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

function throttle(fun, delay) {

        let last, deferTimer

        return function (args) {

            let that = this

            let _args = arguments

            let now = +new Date()

            if (last && now < last + delay) {

                clearTimeout(deferTimer)

                deferTimer = setTimeout(function () {

                    last = now

                    fun.apply(that, _args)

                }, delay)

            }else {

                last = now

                fun.apply(that,_args)

            }

        }

    }

    let throttleAjax = throttle(ajax, 1000)

    let inputc = document.getElementById('throttle')

    inputc.addEventListener('keyup', function(e) {

        throttleAjax(e.target.value)

    })

上一篇:FreeRTOS 之任务 CPU 使用率统计


下一篇:Java线程常用定时任务算法与应用