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 二分法(数组array)
Apr 24 Javascript
js和as的稳定传值问题解决
Jul 14 Javascript
js给onclick赋值传参数的两种方法
Nov 25 Javascript
javascript利用apply和arguments复用方法
Nov 25 Javascript
JavaScript实现的使用键盘控制人物走动实例
Aug 27 Javascript
jQuery实用技巧必备(下)
Nov 03 Javascript
JavaScript获取浏览器信息的方法
Nov 20 Javascript
原生js实现类似fullpage的单页/全屏滚动
Jan 22 Javascript
简化版的vue-router实现思路详解
Oct 19 Javascript
JS实现秒杀倒计时特效
Jan 02 Javascript
使用Vant完成Dialog弹框案例
Nov 11 Javascript
JavaScript实现点击出现子菜单效果
Feb 08 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
PHP new static 和 new self详解
2017/02/19 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
jQuery中prepend()方法用法实例
2014/12/25 Javascript
自己动手手写jQuery插件总结
2015/01/20 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
有关Promises异步问题详解
2015/11/13 Javascript
jQuery解析json数据实例分析
2015/11/24 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
全面接触神奇的Bootstrap导航条实战篇
2016/08/01 Javascript
微信小程序微信支付接入开发实例详解
2017/04/12 Javascript
微信小程序 setData使用方法及常用错误解决办法
2017/05/11 Javascript
JS解析url查询参数的简单代码
2017/08/06 Javascript
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
2018/08/20 Javascript
微信小程序开发之左右分栏效果的实例代码
2019/05/20 Javascript
jquery实现上传图片功能
2020/06/29 jQuery
vue动画—通过钩子函数实现半场动画操作
2020/08/09 Javascript
Python实现在线音乐播放器
2017/03/03 Python
对numpy中的where方法嵌套使用详解
2018/10/31 Python
Python3转换html到pdf的不同解决方案
2019/03/11 Python
python 将有序数组转换为二叉树的方法
2019/03/26 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
pycharm设置python文件模板信息过程图解
2020/03/10 Python
python安装mysql的依赖包mysql-python操作
2021/01/01 Python
用pip给python安装matplotlib库的详细教程
2021/02/24 Python
利用纯CSS3实现动态的自行车特效源码
2017/01/20 HTML / CSS
初三开学计划书
2014/04/27 职场文书
1亿有多大教学反思
2014/05/01 职场文书
新教师培训心得体会
2014/09/02 职场文书
四风对照检查材料范文
2014/09/27 职场文书
2014大学班主任工作总结
2014/11/08 职场文书
签订劳动合同通知书
2015/04/16 职场文书
《正比例》教学反思
2016/02/23 职场文书
Python基础之数据结构详解
2021/04/28 Python