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 Cookie读写删除操作的函数
Mar 02 Javascript
最短的javascript:地址栏载入脚本代码
Oct 13 Javascript
在标题栏显示新消息提示,很多公司项目中用到这个方法
Nov 04 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
Dec 12 Javascript
JS倒计时代码汇总
Nov 25 Javascript
jQuery调取jSon数据并展示的方法
Jan 29 Javascript
JS数组array元素的添加和删除方法代码实例
Jun 01 Javascript
AngularJS使用ng-repeat遍历二维数组元素的方法详解
Nov 11 Javascript
Vue项目中ESlint规范示例代码
Jul 04 Javascript
javascript实现智能手环时间显示
Sep 18 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
Feb 25 Javascript
React更新渲染原理深入分析
Dec 24 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中与数组相关的函数
2007/03/22 PHP
写一段简单的PHP建立文件夹代码
2015/01/06 PHP
php通过获取头信息判断图片类型的方法
2015/06/26 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
ASP中Sub和Function的区别说明
2020/08/30 Javascript
jquery 利用show和hidden实现级联菜单示例代码
2013/08/09 Javascript
鼠标滚轴控制文本框值的JS代码
2013/11/19 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
2013/11/25 Javascript
解决JS中乘法的浮点错误的方法
2014/01/03 Javascript
微信小程序 wxapp内容组件 text详细介绍
2016/10/31 Javascript
Nodejs下用submit提交表单提示cannot post错误的解决方法
2016/11/21 NodeJs
js原生之焦点图转换加定时器实例
2016/12/12 Javascript
Vue.js实现模拟微信朋友圈开发demo
2017/04/20 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
Vue——解决报错 Computed property "****" was assigned to but it has no setter.
2020/12/19 Vue.js
python搭建简易服务器分析与实现
2012/12/15 Python
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
如何使用python把ppt转换成pdf
2019/06/29 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
使用python实现名片管理系统
2020/06/18 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
2020/12/14 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
迪卡侬印度官网:购买所有体育用品
2017/06/24 全球购物
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
大学同学聚会邀请函
2014/01/29 职场文书
中餐厅主管的职责范文
2014/02/04 职场文书
幼儿园的门卫岗位职责
2014/04/10 职场文书
后备干部培训方案
2014/05/22 职场文书
监督检查工作方案
2014/05/28 职场文书
法律讲堂观后感
2015/06/11 职场文书
javascript的var与let,const之间的区别详解
2022/02/18 Javascript