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 相关文章推荐
在网页中控制wmplayer播放器
Jul 01 Javascript
自定义jQuery选项卡插件实例
Mar 27 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
Oct 24 Javascript
jQuery中[attribute=value]选择器用法实例
Dec 31 Javascript
jQuery实现的支持IE的html滑动条
Mar 16 Javascript
javascript制作游戏开发碰撞检测的封装代码
Mar 31 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
Apr 27 Javascript
jQuery基于$.ajax设置移动端click超时处理方法
May 14 Javascript
Jquery跨域获得Json的简单实例
May 18 Javascript
jQuery向父辈遍历的简单方法
Sep 18 Javascript
Java与JavaScript中判断两字符串是否相等的区别
Mar 13 Javascript
vue自定义右键菜单之全局实现
Apr 09 Vue.js
单击某一段文字改写文本颜色
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
星际争霸 Starcraft 编年史
2020/03/14 星际争霸
PHP设计聊天室步步通
2006/10/09 PHP
PHP获取url的函数代码
2011/08/02 PHP
Laravel框架源码解析之模型Model原理与用法解析
2020/05/14 PHP
js style动态设置table高度
2014/10/21 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
2016/01/05 Javascript
AngularJS ng-repeat数组有重复值的解决方法
2016/10/23 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
2017/05/20 jQuery
Angular 4依赖注入学习教程之ClassProvider的使用(三)
2017/06/04 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
Python 类的继承实例详解
2017/03/25 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
python利用ffmpeg进行录制屏幕的方法
2019/01/10 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
keras打印loss对权重的导数方式
2020/06/10 Python
解决pytorch 的state_dict()拷贝问题
2021/03/03 Python
Calzedonia美国官网:意大利风格袜子、打底裤和沙滩装
2018/07/19 全球购物
德国咖啡批发商:Coffeefair
2019/08/26 全球购物
什么是抽象
2015/12/13 面试题
J2EE是技术还是平台还是框架
2016/08/14 面试题
办公室文秘自我鉴定
2013/09/21 职场文书
建筑设计学生的自我评价
2014/01/16 职场文书
个人股份合作协议书
2014/10/24 职场文书
私用公车造成事故检讨书
2014/11/16 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
养成教育工作总结
2015/08/13 职场文书
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫