微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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)

    })

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐