Javascript

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

本文主要是介绍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)

    })

这篇关于JS的节流、函数防抖 原理及使用场景的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!