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 相关文章推荐
location.href语句与火狐不兼容的问题
Jul 04 Javascript
jQuery $.extend()用法总结
Jun 15 Javascript
使用js画图之圆、弧、扇形
Jan 12 Javascript
jQuery的each循环用法简单示例
Jun 12 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
Feb 23 Javascript
js实现图片左右滚动效果
Feb 27 Javascript
详解vue+css3做交互特效的方法
Nov 20 Javascript
AngularJS监听ng-repeat渲染完成的方法
Mar 20 Javascript
angularjs中判断ng-repeat是否迭代完的实例
Sep 12 Javascript
Vue中Quill富文本编辑器的使用教程
Sep 21 Javascript
小程序实现分类页
Jul 12 Javascript
JS实现炫酷雪花飘落效果
Aug 19 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
BBS(php & mysql)完整版(八)
2006/10/09 PHP
PHP 高手之路(二)
2006/10/09 PHP
php访问查询mysql数据的三种方法
2006/10/09 PHP
php 中文处理函数集合
2008/08/27 PHP
php将金额数字转化为中文大写
2015/07/09 PHP
php正则表达式学习笔记
2015/11/13 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
jQuery获取地址栏参数插件(模仿C#)
2010/10/26 Javascript
jquery 回车事件实现代码
2011/08/23 Javascript
JavaScript执行效率与性能提升方案
2012/12/21 Javascript
两个listbox实现选项的添加删除和搜索
2013/03/01 Javascript
怎么清空javascript数组
2013/05/11 Javascript
jquery选择checked在ie8普通模式下的问题
2014/02/12 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
jQuery中dequeue()方法用法实例
2014/12/29 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
JavaScript核心语法总结(推荐)
2016/06/02 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
学习vue.js表单控件绑定操作
2016/12/05 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
2017/03/24 Javascript
react-router实现按需加载
2017/05/09 Javascript
jQuery封装animate.css的实例
2018/01/04 jQuery
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
django创建自定义模板处理器的实例详解
2017/08/14 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
N:Philanthropy官网:美国洛杉矶基础款服装
2020/06/09 全球购物
杭州联环马网络笔试题面试题
2013/08/04 面试题
公司行政经理岗位职责
2013/12/24 职场文书
党员的自我评价范文
2014/01/02 职场文书
艺术教育实施方案
2014/05/03 职场文书
现货白银电话营销话术
2015/05/29 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
java中如何截取字符串最后一位
2022/07/07 Java/Android