函数防抖和函数节流

函数防抖和函数节流

最近看了很多别人写的东西,也是对这两个优化方法有了一个初步的了解,两个方法都是对事件的触发的频率进行控制

函数防抖(debounce)

函数防抖:一个函数在n秒内只会执行一次,如果在n秒内又触发了该事件,则重新计算函数执行时间。
应用场景:onmousemove事件,搜索框显示相关推荐,不停滑动滚轮连续触发多次滚动事件

<div id="test"></div>
 <script>
let test=document.getElementById("test");
        let num=0;
         test.onmousemove=()=>{
           num++;
            test.innerHTML=num;
         }
          </script>

在这里插入图片描述
在给div绑定了mousemove事件后,只要鼠标在元素中移动就会触发该事件,事件被频繁的触发导致页面上的数字增加过快。
那么我们这时就可以使用函数防抖来解决这个问题
1.非立即执行:在移动鼠标后,过n秒才会执行mousemove事件,如果在这n秒内鼠标还在移动那么会不停重置n,直到鼠标不在移动再进行n秒判断才会执行.

封装一个函数,参数是你要执行的函数(作为回调函数传进去,放在定时器里n秒后执行)和时间(你设置的“n”秒),在鼠标持续移动的时候不停地删除上个定时器,重新建一个定时器

  let test=document.getElementById("test");
        let num=0;
        // test.onmousemove=()=>{
        //     num++;
        //     test.innerHTML=num;
        // }
        test.onmousemove=debounce(function fun(){
         num++;
         test.innerHTML=num;
        },1000);
        //持续触发不执行
        function debounce(fun,timer){
            let timeout;
            return function(){
                clearTimeout(timeout); 
                timeout=setTimeout(()=>{
                    fun();
                },timer)
            }
        }

效果在这里插入图片描述
就好比电梯在进入人后等一段时间会关门运行,如果在一个人在电梯快关门之前进入那么电梯又会等一段时间在关门运行
2.立即执行:在鼠标移动时立即触发事件,在此次触发后的n秒内不进行触发,如果n秒内鼠标持续移动,那么n的时间重新计算

建立一个布尔类型变量判断是否可以执行目标函数,函数执行后布尔值变为否执行下面的定时器,定时器只负责把判断条件变为是,如果鼠标持续移动那么条件就一直是否不会执行目标函数

 let test=document.getElementById("test");
        let num=0;
        test.onmousemove=debounce(function fun(){
         num++;
         test.innerHTML=num;
        },1000);
        //立即执行
        function debounce(fun,timer){
            let  timeout;
            let bool=true;
            return function(){
                clearTimeout(timeout); 
                if(bool){
                    fun();
                    bool=false;
                }else{
                    timeout=setTimeout(()=>{
                    bool=true;
                },timer) 
                }
            }
        }

效果:在这里插入图片描述

函数节流(throttle)

函数节流:在连续触发事件时每隔一段时间就会触发一次,减少事件触发频率

        let test = document.getElementById("test");
        let num = 0;
        test.onmousemove = debounce(function fun() {
            num++;
            test.innerHTML = num;
        }, 1000);
        //立即执行
        function throttle(fun, timer) {
            let timeout;
            let bool = true;
            return function () {
                if (bool) {
                    bool = false;
                    setTimeout(() => {
                        fun();
                        bool = true;
                    }, timer)
                } else {
                    return;
                }

            }
        }

如果持续触发移动事件,则,把bool的值变成否,建立一个定时器,在这个定时器完成之前bool的值将一直为否,throttle直接return,直到上一个定时器执行并且改变bool的值返回是,才会进行下一次计时。
效果:在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信小程序中的函数函数节流是两种用于控制函数触发频率的技术。 函数是延迟函数执行,并且不管触发多少次都只执行最后一次。这意味着在一段时间内多次触发函数时,只有最后一次触发会真正执行函数函数的实现方式是,在函数被触发时,设置一个定时器,在定时器的时间间隔内,如果函数再次被触发,就重新设置定时器。只有当定时器时间间隔结束后,才真正执行函数。 [2] 函数节流是减少函数的触发频率,即控制函数在一段时间内只能执行一次。函数节流的实现方式是在函数被触发时,首先判断当前时间与上次触发函数的时间间隔是否超过了设定的时间间隔,如果超过了设定的时间间隔,则执行函数并更新上次触发函数的时间。如果没有超过设定的时间间隔,则不执行函数。这样可以有效控制函数的执行频率。 [2] 总结起来,函数是延迟函数执行,只执行最后一次触发,而函数节流是减少函数的触发频率,控制函数在一段时间内只能执行一次。在微信小程序中,可以根据具体的需求选择适合的技术来控制函数的触发频率。 [2 [3<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [微信小程序 - 函数 / 函数节流(轮子封装)](https://blog.csdn.net/weixin_44198965/article/details/107834833)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [微信小程序之使用函数函数节流](https://blog.csdn.net/weixin_30709929/article/details/97002298)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值