首页 > 技术文章 > Js中的防抖与节流函数

wueiwn 2021-06-20 16:35 原文

1.何为防抖与节流函数呢?

1.防抖(debounce):通过setTimeout方式,在一定的时间间隔内,将多次触发的事件转化为一次触发。也就是说当一个用户一直触发这个函数,且每次触发函数的间隔小于既定时间,那么防抖的情况下只会执行一次

举例:当用户在进行表单提交时,用户提交一次就向服务器发送一次请求,当用户频繁地点击提交,则很自然地就向服务器多次请求,则会对服务器压力很大,那我们就需要想办法解决这种问题

2.节流(throuttle):当持续触发事件时,保证在一定时间内只调用一次事件处理函数,意思就是说,假设一个用户一直触发这个函数,且每次触发小于既定值,函数节流会每隔这个时间调用一次
举例:当我们打游戏的时候长按某个按键,动作是有规律的在间隔时间触发一次

#1.先来看一个没有经过任何处理的demo

由上图可以知道当我们每点击一次控制台就输出一次,这实际上在现实项目中是很浪费资源的

2.来看一下经过防抖函数包装之后的代码

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <input type="text" name="" id="">
    <input type="submit" value="提交" id="input">
    <script>
        const input = document.querySelector('#input');
        // input.addEventListener('click', sumbit);
        input.addEventListener('click', debounce(sumbit, 2000));

        function sumbit(e) {
            console.log('点击');
            // console.log(this);
            // console.log(e);

        };
        //第一次点击立即执行,第二次之后就启用防抖函数
        function debounce(func, delay) {
            let timer = null;
            return function(...args) {
                let firtClick = !timer;
                if (timer) {
                    clearTimeout(timer)
                }
                if (firtClick) {
                    func.apply(this, args)
                }
                timer = setTimeout(() => {
                    timer = null
                }, delay)
            }
        }
    </script>
</body>

</html>

效果图如下:

3.来看一下经过节流函数包装之后的代码

代码如下:

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <input type="text" name="" id="">
    <input type="submit" value="提交" id="input">
    <script>
        const input = document.querySelector('#input');
        // input.addEventListener('click', sumbit);
        input.addEventListener('click', throuttle(sumbit, 2000));

        function sumbit(e) {
            console.log('点击');
            // console.log(this);
            console.log(e);

        };

        function throuttle(func, delay) {
            let begin = 0;
            return function() {
                let currenttime = new Date().getTime();
                console.log(currenttime - begin);
                if (currenttime - begin > delay) {
                    func.apply(this, arguments)
                    begin = currenttime;
                }
            }
        }
    </script>
</body>

</html>

效果图如下:

 

4.总结:1.防抖和节流都是为了解决频繁触发某个事件的情况造成的性能消耗

    2.防抖是将多次执行变为最后一次执行,节流是将多次执行变为每隔一段时间执行

参考连接:https://www.bilibili.com/video/BV1Vy4y1y7tj?p=3&share_source=copy_web

 

推荐阅读