JS 节流函数的实现

简介: JS 节流函数的实现

一、前言

本质上是优化高频率执行代码的一种手段

如:浏览器的 resizescrollkeypressmousemove 等事件在触发时,会不断地调用绑定在事件上的回调函数,极大地浪费资源,降低前端性能

为了优化体验,需要对这类事件进行调用次数的限制,对此我们就可以采用 防抖(debounce) 和 节流(throttle) 的方式来减少调用频率


二、节流函数的定义

限制一个函数在一定时间内只能执行一次


我自己的理解: 节流函数就是 在规定时间内 不管触发几次该事件,都只执行第一次,第一次触发事件等待delay后,事件执行。timer置为null,再次循环。


三、节流函数的实现

1.节流函数的时间戳写法

            // 时间戳写法
            function throttled1(fn, delay = 500) {
                let oldtime = Date.now();
                return function (...args) {
                    let newTime = Date.now();
                    if (newTime - oldtime >= delay) {
                        fn.apply(null, args);
                        oldtime = Date.now();
                    }
                };
            }

2.节流函数的定时器写法

            // 正常使用定时器写法
            function throttled2(func, delay) {
                let timer;
                return function (...args) {
                    if (!timer) {
                        timer = setTimeout(() => {
                            func.apply(this, args);
                            timer = null;
                        }, delay);
                    }
                };
            }

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>
        <button id="button">确定</button>
        <script>
            function throttled(func, delay) {
                let timer;
                return function (...args) {
                    // 这里要判断定时器是否存在,如果存在,就不执行,   如果不存在为null,说明上一次执行完毕,定时器已经为空,可以再次执行下面的函数。
                    if (!timer) {
                        timer = setTimeout(() => {
                            func.apply(this, args);
                            timer = null;
                        }, delay);
                    }
                };
            }
            function submit() {
                // 输出随机函数
                console.log(Math.random());
            }
            let button = document.querySelector('#button');
            button.addEventListener('click', throttled(submit, 1500));
        </script>
    </body>
</html>

四、防抖和节流区别

相同点:


都可以通过使用 setTimeout 实现

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


不同点:


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

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

例如,都设置时间频率为500ms,在2秒时间内,频繁触发函数,节流,每隔 500ms 就执行一次。防抖,则不管调动多少次方法,在2s后,只会执行一次。


五、节流函数的应用

滚动加载,加载更多或滚到底部监听

搜索框,搜索联想功能


目录
相关文章
|
21天前
|
JavaScript 前端开发 Java
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
本文介绍了JavaScript中常用的函数和方法,包括通用函数、Global对象函数以及数组相关函数。详细列出了每个函数的参数、返回值及使用说明,并提供了示例代码。文章强调了函数的学习应结合源码和实践,适合JavaScript初学者和进阶开发者参考。
36 2
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
|
20天前
|
前端开发 JavaScript 开发者
除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。
|
2月前
|
JavaScript 前端开发
JavaScript 函数语法
JavaScript 函数是使用 `function` 关键词定义的代码块,可在调用时执行特定任务。函数可以无参或带参,参数用于传递值并在函数内部使用。函数调用可在事件触发时进行,如用户点击按钮。JavaScript 对大小写敏感,函数名和关键词必须严格匹配。示例中展示了如何通过不同参数调用函数以生成不同的输出。
|
2月前
|
存储 JavaScript 前端开发
JS函数提升 变量提升
【10月更文挑战第6天】函数提升和变量提升是 JavaScript 语言的重要特性,但它们也可能带来一些困惑和潜在的问题。通过深入理解和掌握它们的原理和表现,开发者可以更好地编写和维护 JavaScript 代码,避免因不了解这些机制而导致的错误和不一致。同时,不断提高对执行上下文等相关概念的认识,将有助于提升对 JavaScript 语言的整体理解和运用能力。
|
2月前
|
前端开发 JavaScript UED
JavaScript 中的函数防抖与节流详解及实用场景
在前端开发中,处理用户频繁触发的事件,如输入框的输入、按钮点击、窗口调整大小等,常常需要优化性能以减少无效操作。为此,函数防抖(debounce)和函数节流(throttle)是两种常见的性能优化手段。本文将详细介绍两者的区别与实现,并探讨它们的应用场景。
42 1
|
2月前
|
JavaScript 前端开发
js教程——函数
js教程——函数
40 4
|
2月前
|
存储 JavaScript 前端开发
js中函数、方法、对象的区别
js中函数、方法、对象的区别
19 2
|
2月前
|
JavaScript 前端开发 Java
【javaScript数组,函数】的基础知识点
【javaScript数组,函数】的基础知识点
25 5
|
2月前
|
JavaScript 前端开发
Node.js 函数
10月更文挑战第5天
24 3
|
2月前
|
前端开发 JavaScript
探索JavaScript函数基础
探索JavaScript函数基础
19 3
下一篇
无影云桌面