JS中的节流与防抖(简单说明一下)

83 阅读2分钟

节流原理

7745445_223324726000_2.jpg

就是防止函数高频次的触发,在同一时间段内,只能允许触发一次

比如在我们鼠标滑动的情境下

最简单的方式就是开启一个定时器(如下):


    <script>
        window.addEventListener('scroll',throttle(function(){
            //判断距离window的滚动距离
        },1000))

        function throttle(callback,interval=300){
            let flag=false
            return function(){
                if(flag)return;//如果还在代码还在执行,就忽略本次触发
                flag=true  //更改标志处
                //添加一个计时器
                setTimeout(()=>{
                    callback.apply(this)
                    flag=false   //若执行完毕,就还原标志位
                },interval)
            }
        }
    </script>

> 如果在vue3中我们可以这样写

<script setup>
    //引入前面的js节流代码
   import {throttle} from '***'
   const **=throttle(function(){
    //写下你所需要的代码
})

防抖原理

OIP-C.jfif

就是防止因抖动产生的不必要函数触发,而浪费性能,当抖动结束时,再执行函数

比如在我们表单输入中,就是最直接的防抖案例 防抖最直接的就是打断之前的,从而重新计时,从而避免造成性能浪费,造成环境污染,

        // 使用回调函数  让其可复用
        _input.addEventListener('input', debounce(function () {
            ajax(this.value)  //执行请求
        }))

        // 使用闭包
        function debounce(callback) {
            // 定义为全局变量
            let timer = null
            return function () {
                clearTimeout(timer)  //关闭定时器
                timer = setTimeout(() => {
                    //重新计时
                    callback.apply(this)
                }, 1000)
            }
        }

在vue3中的使用也是和之前的那个类似

<script setup>
    //引入前面的js防抖代码
   import {debounce} from '***'
   const **=throttle(function(){
    //写下你想实现的代码 
})

防抖和节流的对比:

防抖:如果函数连续触发,则计时器不停的重新计时,最后只有一次会最终执行,如同回城次数较少

节流:如果函数连续触发,则会有大量的触发失效,最终执行的频率大幅降低,从而提高性能,如同技能的冷却时间次数比防抖多

好了,我也是这个这个行业的新人,会有很多不清楚的,欢迎指出我的错误,我也想在这一行混口饭吃~~ 如果对我感兴趣的话,就关注我吧,我们可以一起交流