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获取四位数字或者字母的随机数
Jan 09 Javascript
javascript引用类型指针的工作方式
Apr 13 Javascript
javascript正则表达式中分组详解
Jul 17 Javascript
JS实现的表格行上下移动操作示例
Aug 03 Javascript
webpack踩坑之路图片的路径与打包
Sep 05 Javascript
JS+canvas动态绘制饼图的方法示例
Sep 12 Javascript
vue的.vue文件是怎么run起来的(vue-loader)
Dec 10 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
Feb 21 Javascript
JS实现动态添加外部js、css到head标签的方法
Jun 05 Javascript
微信小程序返回上一页传参并刷新过程解析
Dec 13 Javascript
Ant Design的可编辑Tree的实现操作
Oct 31 Javascript
Nuxt的路由配置和参数传递方式
Nov 06 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
PHP遍历二维数组的代码
2011/04/22 PHP
php 判断网页是否是utf8编码的方法
2014/06/06 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
详细解读PHP中接口的应用
2015/08/12 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2021/03/09 PHP
在IE中调用javascript打开Excel的代码(downmoon原作)
2007/04/02 Javascript
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
nodejs分页类代码分享
2014/06/17 NodeJs
Javascript模块化编程详解
2014/12/01 Javascript
JavaScript操作Cookie详解
2015/02/28 Javascript
浅析js中substring和substr的方法
2015/11/09 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
vue + element-ui实现简洁的导入导出功能
2017/12/22 Javascript
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
VUE实现可随意拖动的弹窗组件
2018/09/25 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
11个Javascript小技巧帮你提升代码质量(小结)
2020/12/28 Javascript
[01:15:36]加油刀塔第二期网络版
2014/08/09 DOTA
python使用7z解压apk包的方法
2015/04/18 Python
分析并输出Python代码依赖的库的实现代码
2015/08/09 Python
利用python画出折线图
2018/07/26 Python
详解python 爬取12306验证码
2019/05/10 Python
python命令行参数用法实例分析
2019/06/25 Python
通过python实现弹窗广告拦截过程详解
2019/07/10 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
Python 读取 YUV(NV12) 视频文件实例
2019/12/09 Python
Pycharm debug调试时带参数过程解析
2020/02/03 Python
Python中包的用法及安装
2020/02/11 Python
如何利用Python 进行边缘检测
2020/10/14 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
总经理司机岗位职责
2015/04/10 职场文书
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS
Rust中的Struct使用示例详解
2022/08/14 Javascript