热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

面试题防抖与节流

参考地址:https:yuchengkai.cndocszhfrontend#%E9%98%B2%E6%8A%96参考地址:https:mp.weixin.qq.comsVksh

参考地址:https://yuchengkai.cn/docs/zh/frontend/#%E9%98%B2%E6%8A%96

参考地址:https://mp.weixin.qq.com/s/Vkshf-nEDwo2ODUJhxgzVA

目录

防抖

 延迟的防抖动函数:

改进版(立即执行的防抖动函数)

节流

使用时间戳的节流方案

使用时间戳+定时器版的节流方案



防抖

当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时,知道用户不在触发后的一定时间内才执行该处理函数。

 延迟的防抖动函数:

该实现思路很简单,就是将执行函数放到一个定时器中,如果在定时器触发之前没有事件执行,那么就触发该执行函数,否则清空定时器

问题:该方法不能立即执行...

//防抖函数
const debounce = (fn, wait = 1000) => {let timer = 0;return function (...args) {if (timer)clearTimeout(timer)timer = setTimeout(() => {fn.apply(this, args);}, wait);}}

测试: 

function handle(...args) {console.log('我被执行了',args);}let fn=debounce(handle);window.addEventListener('scroll',()=>fn(1,2,3));

改进版(立即执行的防抖动函数)

const debounce = (fn, wait = 1000,immediate=true) => {let timer,context,args//延迟执行函数const later=()=>setTimeout(()=>{timer=null;if(!immediate){fn.apply(context,args);context=args=null}},wait);//这里的函数是每次实际调用的函数return function(...params){//如果没有创建延迟执行函数则创建if(!timer){timer=later();//如果是立即执行函数if(immediate){fn.apply(this,params);}else{context=thisargs=params}}else{//如果已有延迟执行函数,调用的时候则清除原来的并重新设置一个clearTimeout(timer);timer=later()}}}

节流

节流是将多次执行变成每隔一段时间执行,即n秒内只执行一次。

使用定时器简单版

function throttle(func,delay=1000){let canRun=true;return function(){if(!canRun) return;canRun=false;setTimeout(() => {func.apply(this,arguments);canRun=true;}, delay);}}

使用时间戳的节流方案

const debounce=(func,delay=1000)=>{let context,args;var prev=Date.now();return function(...parms){var now=Date.now();if((now-prev)>=delay){context=this;args=parmsfunc.apply(context,args);prev=Date.now();}else{context=args=null;}} }

使用时间戳+定时器版的节流方案

const debounce &#61; (func, delay &#61; 1000) &#61;> {let timer &#61; null;let startTime &#61; Date.now();return function (...args) {let curTime &#61; Date.now();let remaining &#61; delay - (curTime - startTime);clearTimeout(timer);if (remaining <&#61; 0) {func.apply(this, args);startTime &#61; Date.now();} else {timer &#61; setTimeout(() &#61;> {func.apply(this, args);}, remaining);}}}

 

注:本文只是自我学习的一次总结&#xff0c;若有理解错误&#xff0c;请指出谢谢。

 

 

 

 

 

 

 


推荐阅读
  • WPF开发心率检测大数据曲线图的高性能实现方法
    本文介绍了在WPF开发中实现心率检测大数据曲线图的高性能方法。作者尝试过使用Canvas和第三方开源库,但性能和功能都不理想。最终作者选择使用DrawingVisual对象,并结合局部显示的方式实现了自己想要的效果。文章详细介绍了实现思路和具体代码,对于不熟悉DrawingVisual的读者可以去微软官网了解更多细节。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • Tkinter Frame容器grid布局并使用Scrollbar滚动原理
    本文介绍了如何使用Tkinter实现Frame容器的grid布局,并通过Scrollbar实现滚动效果。通过将Canvas作为父容器,使用滚动Canvas来滚动Frame,实现了在Frame中添加多个按钮,并通过Scrollbar进行滚动。同时,还介绍了更新Frame大小和绑定滚动按钮的方法,以及配置Scrollbar的相关参数。 ... [详细]
  • python+selenium十:基于原生selenium的二次封装fromseleniumimportwebdriverfromselenium.webdriv ... [详细]
  • [翻译]PyCairo指南裁剪和masking
    裁剪和masking在PyCairo指南的这个部分,我么将讨论裁剪和masking操作。裁剪裁剪就是将图形的绘制限定在一定的区域内。这样做有一些效率的因素࿰ ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
  • Android获取app应用程序大小的方法
    Android获取app应用程序大小的方法-Android对这种方法进行了封装,我们没有权限去调用这个方法,所以我们只能通过AIDL,然后利用Java的反射机制去调用系统级的方法。 ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • x86 linux的进程调度,x86体系结构下Linux2.6.26的进程调度和切换
    进程调度相关数据结构task_structtask_struct是进程在内核中对应的数据结构,它标识了进程的状态等各项信息。其中有一项thread_struct结构的 ... [详细]
  • html和js代码互转,html转html5
    本文目录一览:1、html网页跳转javascript代码实现 ... [详细]
author-avatar
勇敢的思竹
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有