节流和防抖

节流与防抖,在前端面试得时候,涉及到页面性能优化得时候可能会问下

两者的基本内容

节流: 连续触发很多次,但是在设置时间内只执行一次

防抖:触发事件在设置时间内只执行一次,如果又触发了事件,重新计时

节流与防抖得用途用的比较多的是 上拉刷新,返回顶部,以及一些拖动到某个位置置顶tab的操作,搜索框输入搜索等

简单用返回顶部做个小例子

比如csdn也有个这种功能,返回顶部,在拖动到某个位置的时候才会出现

 

不考虑任何性能的时候可以直接写

function showTopBtn() {
    // 读取滚动条的位置
    const scrollTop = document.documentElement.scrollTop || document.body.scrollTop
    console.log(scrollTop)
    // 以下做判断
    if (scrollTop > '某某值') {
        '返回顶部按钮显示'
    }
}

window.onscroll = showTopBtn

但是这种情况会发现,一旦拖动,就会疯狂的输出scrollTop

对页面的性能会产生特别大的影响,尤其是针对那种小程序的应用,setData太频繁会卡死小程序

防抖版本:

基本思路是设置一个定时器,当再次触发,清除计时器,重新执行

function showTopBtn() {
    // 读取滚动条的位置
    const scrollTop = document.documentElement.scrollTop || document.body.scrollTop
    console.log(scrollTop)
    // 以下做判断
    if (scrollTop > 300) {
        console.log('返回顶部按钮显示')
    }
}
function _debounce(func, delay) {
    let timeout = null
    return function() {
        if (timeout) {
            clearTimeout(timeout)
        }
        timeout = setTimeout(func, delay)
    }
}
window.onscroll = _debounce(showTopBtn, 200)

节流的话,就是设置一个全局变量,执行之后设置为true, 时间之后设置为false, 当为true的时候不执行return

function _debounce(func, delay) {
    let timeout = null
    return function() {
        if (timeout) {
            clearTimeout(timeout)
        }
        timeout = setTimeout(func, delay)
    }
}
function _throttle(func, delay){
    let handle = false
    return function() {
        if(handle){
            return
        }
        handle = true
        setTimeout(() => {
            func()
            handle = false
        }, delay)
    }
}
// window.onscroll = _debounce(showTopBtn, 200)
window.onscroll = _throttle(showTopBtn, 200)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值