防抖与节流

目录

防抖

什么是防抖

实现防抖的方式

使用定时器实现防抖

节流

什么是节流

实现节流的方式

使用定时器实现节流

通俗解释


防抖

先来看一个例子,在页面中放置一个input框,然后使它每次输入值就会在控制台打印123

<body>
<input placeholder="请输入" />
<script>
    let ipt = document.querySelector('input')
    ipt.oninput = function(){
        console.log("123")
    }
</script>
</body>

结果如下

当不停的进行输入时,控制台会不停的打印123,也就是说不稳定,在抖动

什么是防抖

所谓防抖,就是指触发事件后在n秒内函数只能执行一次,如果在n秒内又触发了事件,则会重新计算函数执行时间

实现防抖的方式

时间戳和定时器

使用定时器实现防抖

<input placeholder="请输入" />
<script>
    let ipt = document.querySelector('input')
    ipt.oninput = debounce(1000)

    //防抖函数封装
    function debounce(wait) {
        let timeOut = null  //先定义一个计时器
        return function () {
            if (timeOut) clearTimeout(timeOut)  //如果之前存在计时器,也就是之前调用过debounce函数,即输入过东西,那么就清空之前的定时器
            timeOut = setTimeout(function () {  //重新设置一个计时器来打印输出123
                console.log("123")
            }, wait);
        } 
    }
</script>

简单来记就是有定时器就关闭定时器重新创建一个新的定时器 

注意:这里的timeOut是闭包内的,所以会将生命周期延长,之后的每个定时器都是这个timeOut

这样,当我们在输入框中输入东西时,就会开始计时,如果1s之内没有再在输入框中输入东西,则会打印一个"123",否则,则会重新开始计时,重复上述操作

节流

再来看一个例子

<div class="box" style="width:200px;height:200px;background-color: turquoise;"></div>
<script>
    let box = document.querySelector('.box')
    box.onmousemove = function(){
        console.log("123")
}
</script>

 结果如下

当用鼠标在左边的色块上轻轻滑动一下,控制台就输出了好多123

什么是节流

所谓节流,就是指连续触发事件但是在n秒中只执行一次函数

实现节流的方式

时间戳和定时器

使用定时器实现节流

<div class="box" style="width:200px;height:200px;background-color: turquoise;"></div>
<script>
    let box = document.querySelector('.box')
    box.onmousemove = throttle(1000)

    //节流函数封装
    function throttle(time){
        let timeOut = null  //定义一个定时器
        return function(){
            if(!timeOut){
            timeOut = setTimeout(() => {
                console.log("123")
                timeOut = null
            }, time);
        }
        }
    }
</script>

简单来记就是没有定时器就创建一个定时器用完再置空 

这样,当我们不停轻扫这个色块时,每隔1s就会输出一次"123"

节流具有稀释事件触发频率的作用

通俗解释

防抖是将多次执行变为最后一次执行,节流是将多次执行变为每隔一段时间执行

欢迎指正

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值