防抖、节流的相关知识

文章介绍了JavaScript中防抖和节流的概念及其区别,防抖用于过滤高频事件的重复执行,如登录按钮点击,而节流则限制事件的执行频率,如滚动事件。文中提供了防抖和节流的实现示例,并讨论了它们在优化性能和减少服务器请求上的应用。
摘要由CSDN通过智能技术生成

   

目录

   

        防抖

        节流 

        防抖和节流的区别

        相同点:

        不同点:


        防抖

        防抖:触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。

        防抖最大的作用是过滤掉一些无效的请求,减少服务器的请求压力。

        防抖,顾名思义就是防止抖动,以免把一次事件误认为多次,敲键盘就是一个每天都会触接到的防抖操作。

        在JS这个世界中,有哪些防抖的场景呢?

        1、登录、发短信等按钮避免用户点击太快,以致与发送了多次请求,需要防抖。

        2、调整浏览器窗口大小时,resize次数过于频繁,造成计算过多,此时需要一次到位,就用到了防抖。

        3、文本编辑实时保存,当无任何操作一秒后进行保存。

        防抖的处理:通过用lodash函数一行就搞定。

 

        通过防抖原理来防抖: 

//防抖原理:
        function debounce(func, wait) {
            let timeout; //外部局部变量
            return function () {
                if (timeout) {
                    clearTimeout(timeout);//去掉之前的无效任务
                }
                //创建新的任务
                timeout = setTimeout(()=>{
                    func.apply(this, arguments);
                }, wait);
            }
        }
        search.onkeyup = debounce(count, 2000)

        节流 

        节流:高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。

        节流,顾名思义就是控制水的流量,控制事件发生的频率,如控制为1s发生一次,甚至1分钟发生一次。与服务器及网关控制的限流类似。

           在JS这个世界中,有哪些节流的场景呢?

        1、scroll事件,每隔一秒计算一次位置信息等。

        2、浏览器播放事件,每隔一秒计算一次进度信息等。

        3、Input框实时搜索并发送请求展示下拉列表,每隔一秒发送一次请求(也可做防抖)

        节流的处理:通过用lodash函数一行就搞定。

         通过节流原理来节流:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>节流</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.21/lodash.js"></script>
    <style>
        #content {
            width: 80%;
            margin: 0 auto;
            height: 30px;
            background-color: greenyellow;
            text-align: center;
            font-size: 24px;
        }
    </style>
</head>

<body>
    <div id="content"></div>
    <script>
        let num = 1
        function count() {
            console.log("开始发送请求");
            content.innerHTML = num++
        }
        let content = document.querySelector("#content")

        //throttle节流:总是在2s后才执行一次
        function throttle(func,wait) {
            let timeout;
            return function () {
                if (!timeout) {
                    timeout = setTimeout(()=>{
                        timeout = null;
                        func();
                    }, wait)
                }
            }
        }
        content.onclick = _.throttle(count, 2000)
    </script>
</body>

</html>

        还可以用时间戳来节流:

 

        防抖和节流的区别

        相同点:

        1、都可以通过使用setTimeout实现。

        2、目的都是降低回调执行频率,节省计算资源

        不同点:

         1、函数防抖在一段连续操作结束后,处理回调,利用clearTimeout和setTimeout实现;函数节流在一段连续操作中,每一段时间只执行一次,频率较高的事件中用来提高性能。

        2、函数防抖关注一定时间连续触发的事件,只在最后执行一次;而函数节流一段时间内只执行一次。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值