防抖函数、节流函数

防抖函数(debounce):当一个函数连续触发,只执行最后一次。n秒内触发事件,函数只会执行一次,如果n秒内再次触发,则会重新计算再次执行函数的时间。

比喻:坐公交,司机需要等最后一个人进入才能关门。每次进入一个人,司机就会多等待几秒再关门。

节流函数(throttle):限制函数在一定时间内只执行一次。

比喻:乘坐地铁,过闸机时,每个人进入后3秒后门关闭,等待下一个人进入。

代码实现
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <title>防抖函数、节流函数</title>
        <style>
            .btn,
            .btn2,
            .btn3 {
                width: 100px;
                height: 100px;
                background-color: red;
                margin-bottom: 50px;
            }
        </style>
    </head>
    <body>
        <div class="btn">点击测试</div>
        <div class="btn2">节流点击</div>
        <div class="btn3">防抖点击</div>
        <script>
            const btn = document.querySelector('.btn');
            const btn2 = document.querySelector('.btn2');
            const btn3 = document.querySelector('.btn3');
            let func = (name, age) => {
                console.log('按钮重复点击了', name, age);
            };
            btn.onclick = func;

            // 节流函数
            const throttle = (fn, wait = 300, ctx) => {
                let lastCall = 0;
                return (...args) => {
                    const _args = args;
                    return () => {
                        const now = Date.now();
                        if (now >= lastCall + wait) {
                            lastCall = now;
                            fn.apply(ctx, _args);
                        }
                    };
                };
            };

            const afterThrottle = throttle(func, 2000);
            btn2.onclick = afterThrottle('小黑不黑', '18');

            // 防抖函数
            const debounce = (fn, wait = 300, ctx) => {
                let lastCall = 0;
                return (...args) => {
                    const _args = args;
                    return () => {
                        const now = Date.now();
                        if (now >= lastCall + wait) {
                            fn.apply(ctx, _args);
                        }
                        lastCall = now;
                    };
                };
            };

            const afterDebounce = debounce(func, 2000);

            btn3.onclick = afterDebounce('小白', '100');
        </script>
    </body>
</html>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容