函数防抖Debounce和函数节流Throttle
函数节流 & 函数防抖
函数节流和函数防抖
函数节流和函数防抖二者很容易被混淆起来。下面贴英文原文,建议认真阅读:
Debouncing enforces that a function not be called again until a certain amount of time has passed without it being called. As in "execute this function only if 100 milliseconds have passed without it being called".
Throttling enforces a maximum number of times a function can be called over time. As in "execute this function at most once every 100 milliseconds".
函数节流:确保函数特定的时间内至多执行一次。
函数防抖:函数在特定的时间内不被再调用后执行。
上面的概念可能还是不够清晰,下面均以“输入框输入文字触发ajax获取数据”为例,分别以防抖和节流的思想来优化,二者的区别:
输入框输入文字如下:1111111111111111111111(停顿3s继续输入)11111111111111111
函数防抖:当用户持续输入1的过程中,并不会发送ajax,当用户停止输入2s后,发送ajax请求,之后到第3s后,用户继续输入1的过程中,依旧不会发送ajax,当用户停止输入2s后,又触发ajax请求。
函数节流:当用户持续输入1的过程中(假设输入1的过程超过2s了),从你开始输入1开始计时,到第2s,发送ajax请求。函数节流与你是否停止输入无关,是一种周期性执行的策略。
一句话概括:函数节流是从用户开始输入就开始计时,而函数节流是从用户停止输入开始计时。
场景分析
函数节流(throttle)
- 频繁的mousemove/keydown,比如高频的鼠标移动,游戏射击类的
- 搜索联想(keyup)
- 进度条(我们可能不需要高频的更新进度)
- 拖拽的dragover等
- 高频的点击,抽奖等
- 无限滚动(用户向下滚动无限滚动页面,要检查滚动位置距底部多远。如果离底部进了,发ajax请求获取更多数据插入页中)
函数防抖(debounce)
- scroll/resize事件,浏览器改变大小,有人说是throttle
- 文本连续输入,ajax验证/关键字搜索
注:throttle和debounce均是通过减少实际逻辑处理过程的执行来提高事件处理函数运行性能的手段,并没有实质上减少事件的触发次数。
使用函数节流是进行前端性能优化的方法之一,例如,懒加载的实现。
实现函数防抖和函数节流
函数防抖
function debounce(func,wait){var timeout;return function(){var context=this;//用来保存this的正确指向var args=arguments;//用来保存触发的事件类型,例如keyboard eventclearTimeout(timeout);//每次都重新开始计时timeout=setTimeout(function(){func.apply(context,args);},wait);}
}
a.onkeyup=debounce(getValue,3000);
function getValue(){console.log(this.value);//使用debounce调用它时,this就变为window
}
函数节流
function throttle(func, wait) {var timeout, context, args, result;var previous = 0;var later = function() {previous = +new Date();timeout = null;func.apply(context, args)};var throttled = function() {var now = +new Date();//下次触发 func 剩余的时间var remaining = wait - (now - previous);context = this;args = arguments;// 如果没有剩余的时间了或者你改了系统时间if (remaining <= 0 || remaining > wait) {if (timeout) {clearTimeout(timeout);timeout = null;}previous = now;func.apply(context, args);} else if (!timeout) {timeout = setTimeout(later, remaining);}};return throttled;
}
函数防抖Debounce和函数节流Throttle相关推荐
- SAP UI5和Angular的函数防抖(Debounce)和函数节流(Throttle)实现原理介绍
这是Jerry 2021年的第 11 篇文章,也是汪子熙公众号总共第 282 篇原创文章. Jerry之前的文章 SAP UI5 OData谣言粉碎机:极短时间内发送两个Odata request, ...
- 函数防抖(debounce)和节流(throttle)在H5编辑器项目中的应用
函数防抖(debounce)和节流(throttle)在H5编辑器项目中的应用 文章目录 函数防抖(debounce)和节流(throttle)在H5编辑器项目中的应用 1. 为什么要防抖节流 1.1 ...
- 函数防抖debounce和节流throttle
debounce 函数防抖 1.什么是函数防抖 函数防抖是优化高频率执行 js 代码的一种手段 可以让被调用的函数在一次连续的高频率操作过程中只被调用一次 2.函数防抖的作用 减少代码执行次数,提升网 ...
- 函数防抖(debounce)和节流(throttle)以及lodash的debounce源码赏析
函数节流和去抖的出现场景,一般都伴随着客户端 DOM 的事件监听.比如scroll resize等事件,这些事件在某些场景触发非常频繁. 比如,实现一个原生的拖拽功能(不能用 H5 Drag& ...
- 详解防抖函数(debounce)和节流函数(throttle)
函数防抖(debounce) 函数防抖,就是指触发事件后,在 n 秒后只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数的执行时间. 简单的说,当一个动作连续触发,只执行最后一次. 列举: ...
- 函数防抖 和 函数节流
函数防抖 和 函数节流 函数防抖(debounce) 概念 函数防抖 就是指 触发事件后 在 n 秒内 函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间. 简单的说,当一个动作 ...
- JavaScript函数节流和函数防抖
1.为什么需要函数防抖和函数节流? 在浏览器中某些计算和处理要比其他的昂贵很多.例如DOM操作比起非DOM交互需要更多的内存和CPU占用时间.连续尝试进行过多的DOM操作可能会导致浏览器挂起,甚至崩溃 ...
- JavaScript 函数循环、延时、节流、防抖
函数循环(setInterval) 间隔指定的毫秒数不停地执行指定的代码 <button onclick="myStartFunction()">开始</butt ...
- 防抖debounce和节流throttle
大纲 一.出现缘由 二.什么是防抖debounce和节流throttle 三.应用场景 3.1防抖 3.2节流 一.出现缘由 前端开发中,有一部分用户行为会频繁触发事件,而对于DOM操作,资源加载等耗 ...
最新文章
- 解压ubi文件_Linux 文件压缩与解压相关
- html字符串转svg,【SVG】如何操作SVG Text
- 第五百一十八天 how can I 坚持
- 【干货】全球大数据领域顶级开源工具汇总
- atitit.细节决定成败的适合情形与缺点
- MVC3和MVC4内置Razor引擎的差异
- Reloading Java Classes 101: Objects, Classes and ClassLoaders Translation
- dlink虚拟服务器端口转发,D-Link路由器端口转发怎么设置【图文教程】
- Excel 2016双击文件打开为空白的解决办法-亲测解决。
- Web开发基本准则-55实录-Web访问安全
- [微软官网] SQLSERVER 执行页面还原
- web程序常见错误及解决方法
- 用计算机模拟宇宙,科学家尝试利用计算机模拟整个宇宙的演化
- 字节、KB、MB、GB 之间的换算关系
- 直连路由、主机路由以及选择顺序
- 2016小米-风口的猪-中国牛市-Java
- 帕拉丁(山东)俱乐部大型西藏自驾游,天籁之旅,与心灵自由相约
- 页面向左移动动画html,jQuery仿左右窗帘拉开页面动画特效
- (C++)将8000秒换算成小时分钟秒的形式
- EditPlus安装Json格式化工具功能