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 相关文章推荐
Javascript 代码也可以变得优美的实现方法
Jun 22 Javascript
Js+Flash实现访问剪切板操作
Nov 20 Javascript
js 固定悬浮效果实现思路代码
Aug 02 Javascript
jquery获取tagName再进行判断
May 29 Javascript
js字符串操作方法实例分析
May 06 Javascript
jquery form表单获取内容以及绑定数据
Feb 24 Javascript
微信小程序(应用号)简单实例应用及实例详解
Sep 26 Javascript
简单理解js的冒泡排序
Dec 19 Javascript
最常见和最有用的字符串相关的方法详解
Feb 06 Javascript
使用Vuex解决Vue中的身份验证问题
Sep 28 Javascript
基于JS实现前端压缩上传图片的实例代码
May 14 Javascript
Javascript实现打鼓效果
Jan 29 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
如何将数据从文本导入到mysql
2006/10/09 PHP
PHP入门教程之表单与验证实例详解
2016/09/11 PHP
PHP的PDO大对象(LOBs)
2019/01/27 PHP
jQuery 使用手册(四)
2009/09/23 Javascript
jquery操作select大全
2014/04/25 Javascript
jQuery中parents()和parent()的区别分析
2014/10/28 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
JavaScript转换与解析JSON方法实例详解
2015/11/24 Javascript
JavaScript截取指定长度字符串点击可以展开全部代码
2015/12/04 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
javascript入门之string对象【新手必看】
2016/11/22 Javascript
javascript监听页面刷新和页面关闭事件方法详解
2017/01/09 Javascript
node.js中使用Export和Import的方法
2017/09/18 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
2020/09/04 Javascript
[01:06:18]DOTA2-DPC中国联赛 正赛 Phoenix vs Dynasty BO3 第二场 1月26日
2021/03/11 DOTA
用python实现的可以拷贝或剪切一个文件列表中的所有文件
2009/04/30 Python
Python多线程编程(六):可重入锁RLock
2015/04/05 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
2018/04/19 Python
Python封装原理与实现方法详解
2018/08/28 Python
用Django写天气预报查询网站
2018/10/21 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
Europcar西班牙:全球汽车租赁领域的领导者
2018/09/17 全球购物
财务管理个人自荐书范文
2013/11/24 职场文书
《雨点》教学反思
2014/02/12 职场文书
人力资源作业细则
2014/03/03 职场文书
公安交警中队队长个人对照检查材料思想汇报
2014/10/05 职场文书
2015中学教师个人工作总结
2015/07/22 职场文书
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB