js中的防抖和节流

本文详细介绍了前端开发中两种重要的性能优化技术——防抖(debounce)和节流(throttle)。防抖确保在设定时间内只执行最后一次函数调用,而节流则限制函数在特定时间间隔内只能执行一次。通过示例代码,展示了如何实现防抖和节流函数,并在输入提交场景中应用。理解并正确使用这两种技术可以显著提升用户体验,防止因频繁触发导致的性能问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

防抖

防抖:在一段时间内允许多次触发函数,但是只在最后一次有效(执行)
做法:
每次触发函数清除掉原来的定时器,重新开始计时。
如果在规定时间内不再触发函数,则执行,否则,清除掉之前的定时器,重新计时。


    <!-- 防抖:防抖和节流不同点在于,函数在一段时间内可以多次调用,尽仅在最后一次调用有效 -->
    <!-- 每一次的点击都要清除掉之前的定时器,重新定时 -->
    <input type="text">
    <button>提交</button>
    <script>
        var btn = document.querySelector('button');
        btn.addEventListener('click', debounce(submit, 2000));
        function submit() {
            console.log('点击了');
        }
        //   为submit函数添加防抖
        function debounce(func, delay) {
            var timeout;
            return function () {
                clearTimeout(timeout);
                timeout = setTimeout(() => {
                    func.apply(this, arguments);
                }, delay)
            }
        }
    </script>
</body>

节流

节流:在一段时间内,只能触发一次函数。
做法:触发函数时判断是否到达了指定时间,如果到达了指定时间,执行;否则不执行弹出警告

  1. 时间戳法

    <input type="text">
    <button>提交</button>
    <script>
          var btn = document.querySelector('button');
        btn.addEventListener('click', throttle(submit, 2000));
         function thorttle(func,delay){ //传入需要节流的函数,延迟时间
            var last = 0; // 上一次触发的时间
            return function(){
                var now = Date.now(); //获取当前时间
                if(now >= delay + last){
                    //当前时间已经符合再次触发条件了
                    func(this,arguments);
                    // console.log(this);  //this指向window
                    last = now; //当前的时间就变为了上次的
                }else{
                    console.log('时间未到');
                }
            }
        }
    </script>
  1. 定时器法
<body>
    <input type="text">
    <button>提交</button>
    <script>
          var btn = document.querySelector('button');
        btn.addEventListener('click', throttle(submit, 2000));
        function thorttle(func, delay) {
            //设置一个空的定时器
            var timer = null;
            return function () {
                if (!timer) {
                    // 如果定时间为空,执行操作
                    func.apply(this, arguments);
                    // 设置定时器,并且在delays后定时器变为空时,可再次操作
                    timer = setTimeout(() => {
                        timer = null;
                    }, delay);
                } else {
                    console.log('时间未到');
                }
            }
        }
    </script>

笔记跟随:

https://juejin.cn/post/6962949488646291486

### JavaScript防抖节流的原理及实现方式 #### 1. 防抖(Debouncing) 防抖的核心思想是:当事件被触发时,设置一个定时器延迟执行回调函数;如果在设定的延时期间内再次触发相同的事件,则清除之前的定时器并重新计时。只有当最后一次触发之后经过了指定的时间间隔,才会真正执行回调函数。 ##### 实现代码示例 ```javascript function debounce(func, wait = 500) { let timeout; return function(...args) { clearTimeout(timeout); // 清除上次未到期的定时器 timeout = setTimeout(() => func.apply(this, args), wait); // 设置新的定时器 }; } ``` 这种机制非常适合应用于输入框自动补全、窗口尺寸调整等场景中[^1]。例如,在用户停止打字后的几秒钟再发起请求获取建议列表项,这样可以减少不必要的网络请求次数从而提高效率[^2]。 --- #### 2. 节流(Throttling) 与防抖不同的是,节流的目标是在固定时间段内最多只允许某段代码被执行一次。即便在此期间多次尝试去触发展开行为也只会取第一次或者最后那次有效而已。常见的做法有两种——基于时间戳版本以及标志位控制版。 ##### 时间戳版本实现代码示例 ```javascript function throttleByTimestamp(func, limit = 1000){ var lastCallTime=0;//记录最近一次成功调用func的时间点 return function(...args){ const now=new Date().getTime(); if(now-lastCallTime>=limit){ lastCallTime=now; return func.apply(this,args); } } } ``` 另一种更灵活的方式则采用布尔型变量作为开关状态指示灯来管理访问权限: ```javascript function throttleByFlag(func,delay=1000){ let canRun=true; //初始状态下是可以运行的状态 return function(...args){ if(!canRun)return ;//不可运行就直接退出 canRun=false; //标记为不可运行 setTimeout(()=>{ func.apply(this,args); canRun=true; //恢复可运行状态 },delay); } } ``` 这两种不同的策略各有优劣之处,开发者可以根据实际情况选取最适合自己项目需求的那一款解决方案[^4]。 --- #### 应用场景分析 - **防抖的应用** - 文本输入实时搜索:等待用户完全结束输入后再发送查询请求。 - 窗口大小改变(onresize):防止因快速拉伸浏览器造成大量重复渲染工作负担过重的情况发生。 - **节流的应用** - 页面滚动(scroll)加载更多内容:每隔一段时间检查是否到达底部进而决定是否追加新条目显示出来而不是每次滚一点都做判断。 - 鼠标连续点击按钮:限定单位时间内只能响应单次动作避免误操作引发连锁反应损害系统稳定性[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值