【连载】手摸手解析JS手写面试题题系列2——实现throttle(节流)方法

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 【连载】手摸手解析JS手写面试题题系列2——实现throttle(节流)方法

上一篇笔记聊了如何实现防抖(debounce)方法,其实防抖和节流方法的区别,在面试也是经常被问到的,所以我们在实现节流方法之前,先聊聊节流和防抖之间的区别,方便大家更好的理解这两个方法 防抖和节流的区别

举一个例子,比如你去饮水机接水喝,你疯狂的按那个出水按钮,这个时候节流和防抖就会有两种不同的表现(不严谨,但是可以粗浅的这么理解):

防抖的饮水机,它不管你按出水按钮按的多疯狂,它只会在你停下来之后开始出水,也就是说它把你频繁的多次操作都忽略了,它只响应你的最后一次操作

节流的饮水机,它不管你按出水按钮按的多疯狂,它只会按照它自己的节奏来出水,比如它只会间隔2秒出一次水,就算你手速再快,它也是按照自己的节奏来出水

上面这两个例子,可以让你比较粗浅的理解出防抖和节流之间的区别,迁移到我们平时写代码来说,可以考虑这两个例子:

防抖:比如联想输入框,其实不管你输入的再快,只需要在你输入结束之后把输入框内的字符拿到去搜索即可,所以这里就可以用防抖来优化,等用户输入停止后再去发1次请求就好,前面发了也是浪费

节流:比如页面上常见的拖拽功能,我们需要实时的获取当前的拖拽位置,因为拖拽这个事件的反馈频率非常的高,你稍微移动一下,可能会有几十上百次的事件响应,所以我们完全没必要对每一次的事件响应都做处理,这样子程序会卡死;此时就可以使用节流来优化,我们只需要隔几百毫秒去响应1次拖拽事件拿到当前的位置即可

我觉得我应该把防抖和节流的区别讲明白了,接下来是节流函数的实现


实现节流函数


写代码之前先默念我的编程座右铭:

先跑起来,再去优化

思考一下,其实节流函数就是做了这么个事儿,还是以饮水机为例:

首先规定饮水机的按钮不管按的多快,饮水机都是每隔一秒钟出一次水

那么我们的节流函数要做的事情就是,如果当前按饮水机的时间,距离上次出水的时间,正好是大于等于1秒,那么就可以出水,否则说明在1秒钟以内就被按了很多次,就不用出水

我们写一下伪代码:


如果当前时间-上次函数运行时间>=节流间隔时间
  运行函数,并且把上次函数运行时间更新为当前时间
否则
  不运行


写成代码是这样的:


function throttle(func, wait) {
    let start = 0;
    return function () {
        if (start === 0) {
            start = Date.now();
        } else {
            const now = Date.now();
            if (now - start < wait) {
                // 不执行
            } else {
                func();
                start = now;
            }
        }
    }
 }


再优化一下就是这样,可以接受自定义的参数


function throttle(func, wait) {
    let start = 0;
    return function (...args) {
        if (start === 0) {
            start = Date.now();
        } else {
            const now = Date.now();
            if (now - start >= wait) {
                func.apply(this, args);
                start = now;   
            }
        }
    }
}


当然了, 我这个实现方式并不是最完美的,比如说还可以加上首次执行、末次执行等等,感兴趣可以直接去啃lodash的源码


总结

相关文章
|
16天前
|
Web App开发 JavaScript 前端开发
如何确保 Math 对象的方法在不同的 JavaScript 环境中具有一致的精度?
【10月更文挑战第29天】通过遵循标准和最佳实践、采用固定精度计算、进行全面的测试与验证、避免隐式类型转换以及持续关注和更新等方法,可以在很大程度上确保Math对象的方法在不同的JavaScript环境中具有一致的精度,从而提高代码的可靠性和可移植性。
|
1天前
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
|
15天前
|
JavaScript 前端开发 索引
js中DOM的基础方法
【10月更文挑战第31天】这些DOM基础方法是操作网页文档结构和实现交互效果的重要工具,通过它们可以动态地改变页面的内容、样式和行为,为用户提供丰富的交互体验。
|
15天前
|
缓存 JavaScript UED
js中BOM中的方法
【10月更文挑战第31天】
|
17天前
|
JSON JavaScript 前端开发
[JS]面试官:你的简历上写着熟悉jsonp,那你说说它的底层逻辑是怎样的?
本文介绍了JSONP的工作原理及其在解决跨域请求中的应用。首先解释了同源策略的概念,然后通过多个示例详细阐述了JSONP如何通过动态解释服务端返回的JavaScript脚本来实现跨域数据交互。文章还探讨了使用jQuery的`$.ajax`方法封装JSONP请求的方式,并提供了具体的代码示例。最后,通过一个更复杂的示例展示了如何处理JSON格式的响应数据。
29 2
[JS]面试官:你的简历上写着熟悉jsonp,那你说说它的底层逻辑是怎样的?
|
4天前
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
|
15天前
|
JavaScript 前端开发
.js方法参数argument
【10月更文挑战第26天】`arguments` 对象为JavaScript函数提供了一种灵活处理参数的方式,能够满足各种不同的参数传递和处理需求,在实际开发中具有广泛的应用价值。
34 7
|
15天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
55 4
|
16天前
|
JavaScript 前端开发 图形学
JavaScript 中 Math 对象常用方法
【10月更文挑战第29天】JavaScript中的Math对象提供了丰富多样的数学方法,涵盖了基本数学运算、幂运算、开方、随机数生成、极值获取以及三角函数等多个方面,为各种数学相关的计算和处理提供了强大的支持,是JavaScript编程中不可或缺的一部分。
|
16天前
|
JavaScript 前端开发 开发者

推荐镜像

更多
下一篇
无影云桌面