javascript中的throttle和debounce浅析


Posted in Javascript onJune 06, 2014

throttle

我们这里说的throttle就是函数节流的意思。再说的通俗一点就是函数调用的频度控制器,是连续执行时间间隔控制。主要应用的场景比如:

1.鼠标移动,mousemove 事件
2.DOM 元素动态定位,window对象的resize和scroll 事件

有人形象的把上面说的事件形象的比喻成机关枪的扫射,throttle就是机关枪的扳机,你不放扳机,它就一直扫射。我们开发时用的上面这些事件也是一样,你不松开鼠标,它的事件就一直触发。例如:

var resizeTimer=null;
$(window).on('resize',function(){
       if(resizeTimer){
           clearTimeout(resizeTimer)
       }
       resizeTimer=setTimeout(function(){
           console.log("window resize");
       },400);

debounce

debounce和throttle很像,debounce是空闲时间必须大于或等于 一定值的时候,才会执行调用方法。debounce是空闲时间的间隔控制。比如我们做autocomplete,这时需要我们很好的控制输入文字时调用方法时间间隔。一般时第一个输入的字符马上开始调用,根据一定的时间间隔重复调用执行的方法。对于变态的输入,比如按住某一个建不放的时候特别有用。

debounce主要应用的场景比如:
文本输入keydown 事件,keyup 事件,例如做autocomplete

这类网上的方法有很多,比如Underscore.js就对throttle和debounce进行封装。jQuery也有一个throttle和debounce的插件:jQuery throttle / debounce,所有的原理时一样的,实现的也是同样的功能。再奉上一个自己一直再用的throttle和debounce控制函数:

/*
* 频率控制 返回函数连续调用时,fn 执行频率限定为每多少时间执行一次
* @param fn {function}  需要调用的函数
* @param delay  {number}    延迟时间,单位毫秒
* @param immediate  {bool} 给 immediate参数传递false 绑定的函数先执行,而不是delay后后执行。
* @return {function}实际调用函数
*/
var throttle = function (fn,delay, immediate, debounce) {
   var curr = +new Date(),//当前事件
       last_call = 0,
       last_exec = 0,
       timer = null,
       diff, //时间差
       context,//上下文
       args,
       exec = function () {
           last_exec = curr;
           fn.apply(context, args);
       };
   return function () {
       curr= +new Date();
       context = this,
       args = arguments,
       diff = curr - (debounce ? last_call : last_exec) - delay;
       clearTimeout(timer);
       if (debounce) {
           if (immediate) {
               timer = setTimeout(exec, delay);
           } else if (diff >= 0) {
               exec();
           }
       } else {
           if (diff >= 0) {
               exec();
           } else if (immediate) {
               timer = setTimeout(exec, -diff);
           }
       }
       last_call = curr;
   }
};/*
* 空闲控制 返回函数连续调用时,空闲时间必须大于或等于 delay,fn 才会执行
* @param fn {function}  要调用的函数
* @param delay   {number}    空闲时间
* @param immediate  {bool} 给 immediate参数传递false 绑定的函数先执行,而不是delay后后执行。
* @return {function}实际调用函数
*/
var debounce = function (fn, delay, immediate) {
   return throttle(fn, delay, immediate, true);
Javascript 相关文章推荐
jQuery 类twitter的文本字数限制带提示效果插件
Apr 16 Javascript
jQuery 源码分析笔记(5) jQuery.support
Jun 19 Javascript
javascript实现文本域写入字符时限定字数
Feb 12 Javascript
JS验证邮件地址格式方法小结
Dec 01 Javascript
jQuery中通过ajax调用webservice传递数组参数的问题实例详解
May 20 Javascript
关于js函数解释(包括内嵌,对象等)
Nov 20 Javascript
angular4 如何在全局设置路由跳转动画的方法
Aug 30 Javascript
JQuery Ajax动态加载Table数据的实例讲解
Aug 09 jQuery
Vue+axios+WebApi+NPOI导出Excel文件实例方法
Jun 05 Javascript
vuex+axios+element-ui实现页面请求loading操作示例
Feb 02 Javascript
JavaScript闭包原理与用法学习笔记
May 29 Javascript
Javascript新手入门之字符串拼接与变量的应用
Dec 03 Javascript
单击某一段文字改写文本颜色
Jun 06 #Javascript
Javascript中的异步编程规范Promises/A详细介绍
Jun 06 #Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
Jun 06 #Javascript
jQuery插件开发详细教程
Jun 06 #Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
Jun 06 #Javascript
jquery进行数组遍历如何跳出当前的each循环
Jun 05 #Javascript
js检验密码强度(低中高)附图
Jun 05 #Javascript
You might like
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
jquery 图片 上一张 下一张 链接效果(续篇)
2010/04/20 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
10条建议帮助你创建更好的jQuery插件
2015/05/18 Javascript
详解AngularJS中的表格使用
2015/06/16 Javascript
js简单实现Select互换数据的方法
2015/08/17 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
2016/08/01 Javascript
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
老生常谈Bootstrap媒体对象
2017/07/06 Javascript
vue.js 实现点击按钮动态添加li的方法
2018/09/07 Javascript
React事件处理的机制及原理
2018/12/03 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
详解JavaScript作用域 闭包
2020/07/29 Javascript
Python实现堆排序的方法详解
2016/05/03 Python
Python 获取中文字拼音首个字母的方法
2018/11/28 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
Python接口开发实现步骤详解
2020/04/26 Python
python中wheel的用法整理
2020/06/15 Python
Python实现快速大文件比较代码解析
2020/09/04 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
非洲NO.1网上商店:Jumia肯尼亚
2016/08/18 全球购物
澳大利亚网上玩具商店:Mr Toys Toyworld
2018/03/25 全球购物
受希腊女神灵感的晚礼服、鸡尾酒礼服和婚纱:THEIA
2018/04/15 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
双立人美国官方商店:ZWILLING集团餐具和炊具
2020/05/07 全球购物
广播电视新闻学专业应届生求职信
2013/10/08 职场文书
办加油卡单位介绍信
2014/01/09 职场文书
生产部岗位职责范文
2014/02/07 职场文书
英语辞职信怎么写
2015/02/28 职场文书
专业技术职务聘任证明
2015/03/02 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android