节流与防抖

简介

浏览器中某些计算和处理要比其他的昂贵的很多,例如,DOM操作比起非DOM操作交互需要更多的内存和CPU时间,连续尝试进行过多的DOM相关操作可能会导致浏览器挂起,有时候甚至会崩溃,为了解决这个问题,我们一般都采用节流或者防抖来解决。

节流(throttle)

不管你操作有多迅速,只按指定时间执行一次,应用场景有拖拽获取X,Y值等。

       /*
        *@param fn 处理程序
        *@param delay 指定时间
        *@return {Function}
        **/
        function throttle(fn, delay = 500) {
            let timeout = null
            return function () {
                if (!timeout) {
					timeout = setTimeout(() => {
						fn.apply(this, arguments)
						timeout = null
					}, delay)
				}
            }
        }

但是以上的节流不适合所有的场景的,因为他并不会执行最后一次操作,如果你还想执行最后一次,那么请按以下方法:

       /*
        *@param fn 处理程序
        *@param delay 指定时间
        *@param atleast 至少执行时间
        *@return {Function}
        **/
        function throttle(fn, delay=500, atleast=1000) {
            let timeout = null
            let startTime = new Date()
            return function() {
                const curTime = new Date()
                clearTimeout(timeout)
                if (curTime - startTime >= atleast) {
                    fn.apply(this, arguments)
                    startTime = curTime
                } else {
                    timeout = setTimeout(()=>{
						fn.apply(this, arguments)
					}, delay)
                }
            }
        }

防抖(debounce)

不管你操作有多迅速,在指定时间内,只执行最后一次,应用场景根据input输入内容查询搜索结果等。

       /*
        *@param fn 处理程序
        *@param delay 指定时间
        *@return {Function}
        **/
        function debounce (fn, delay = 500) {
            let timeout= null
            return function () {
                timeout && clearTimeout(timeout)
                timeout = setTimeout(() => {
                    fn.apply(this, arguments)
                    timeout = null
                },delay)
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值