防抖与节流详细

本文介绍了JavaScript中的函数防抖和节流技术,这两种技术常用于优化高频率执行的代码,比如按钮点击和页面滚动监听。防抖确保在最后一次操作后执行函数,而节流则在指定时间间隔内执行一次。通过实例代码展示了如何实现防抖和节流,并提供了封装后的函数供直接使用。此外,还讨论了它们在input框和页面滚动场景中的应用。
摘要由CSDN通过智能技术生成

函数防抖和函数节流,两者都是优化高频率执行js代码的一种手段。

  1. 防抖:任务频繁触发的情况下,只有任务触发的间隔超过指定间隔的时候,任务才会执行。
  2. 节流:指定时间间隔内只会执行一次任务(一定时间内js方法只跑一次)。

当我们在业务逻辑中使用定时器来时间防抖和节流会显得很臃肿,像是一坨翔一样,所以呢我们会把防抖的代码封装成一个函数 在业务逻辑中直接调用就可以了 防抖是怎么实现的呢 ?

在业务场景中大多数防抖用在按钮 和input框 节流最常见的就是页面滚动条监听

用input框举个栗子:

<input type="text">


let inp = document.querySelector('input') //获取dom

let time = null                           //创建一个定时器初始值

inp.oninput=function () {
                                 //time有值代表定时器一直在触发 防抖的目的就是执行最后一次
   if( time !== null){              //判断定时器如果有值就清掉 只执行最后一次
                                 
     clearTimeout(time)
   }

  time=setTimeout(()=>{     //最后一次

       console.log(this.value);
       //业务逻辑代码
} )
 
}

上面这段代码就是为了执行业务代码 很大一坨 我们利用闭包去封装一哈

<input type="text">
//防抖
 let inp = document.querySelector('input')
        inp.oninput = doc( function() {          //直接调用
            // console.log(this);指向window对象
            // call改变了 谁调用fn这个this就指向谁
            console.log(this.value);
        }, 1000)



//利用闭包封装一个计时器


//调用这个函数的时需要传两个参数 第一个就是事件要执行的函数 第二个参数就是要执行的计时器的时间
        function doc(fn, delay) {
            let time = null  //创建一个计时器
            return function () {
                if (time !== null) {  //当计时器有值的时候清掉 重新创建一个
                    clearTimeout(time)
                }
                time = setTimeout(() => {    //执行 新创建的这一个计时器
                    fn.call(this)
                    // call改变了 谁调用fn这个this就指向谁
                }, delay)
            }
        }

封装好后只需要调用就可以了 简简单单那么两行代码就搞定了 清爽无比 

节流最常见的就是页面滚动条监听

理解了防抖之后我们直接封装后调用

//节流


body{
            height: 2000px;
        }


 window.onscroll = throttle(function () {
            console.log('asd');
          },500)


//封装
        function throttle(fn,delay) { 
            let fall = true
           return function () {
            if (fall) {
                setTimeout(() => {
                    fn.call(this)
                    fall=true
                }, delay)
            }
            // 执行完setTimeout变成false 不在执行了
            // 所以每次执行完后把fall变成true才能在500后继续执行
            fall = false
        }
         }

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue中,有一些常用的防抖节流插件可以方便地实现防抖节流的功能。以下是两个常用的插件: 1. Lodash(防抖节流) Lodash是一个JavaScript实用工具库,它提供了许多常用的函数和方法,包括防抖节流函数。使用Lodash的`debounce`和`throttle`函数可以很方便地实现防抖节流。 安装Lodash: ```bash npm install lodash ``` 使用示例: ```javascript import { debounce, throttle } from 'lodash'; // 防抖示例 const debouncedFunc = debounce(() => { console.log('执行操作'); }, 500); // 节流示例 const throttledFunc = throttle(() => { console.log('执行操作'); }, 200); ``` 2. Vue-lodash(防抖节流) Vue-lodash是一个专门为Vue开发的Lodash插件,它提供了Vue指令的方式来使用Lodash的方法,包括防抖节流。 安装Vue-lodash: ```bash npm install vue-lodash ``` 在Vue项目中使用Vue-lodash示例: ```javascript import Vue from 'vue'; import VueLodash from 'vue-lodash'; import { debounce, throttle } from 'lodash'; Vue.use(VueLodash, { lodash: { debounce, throttle } }); ``` 在Vue组件中使用防抖节流: ```html <template> <div> <button v-debounce:click="debouncedFunc">点击按钮(防抖)</button> <button v-throttle:click="throttledFunc">点击按钮(节流)</button> </div> </template> <script> export default { methods: { debouncedFunc() { console.log('执行操作'); }, throttledFunc() { console.log('执行操作'); }, }, }; </script> ``` 以上是两个常用的Vue插件,可以方便地在Vue项目中使用防抖节流功能。根据具体需求选择合适的插件来使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值