javascript中的throttle和debounce浅析

时间:2024-05-08 10:10:27 

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,throttle,debounce
0
投稿

猜你喜欢

  • JavaScript刷新页面的几种方法总结

    2024-04-22 12:53:01
  • 完美的js验证网址url(正则表达式)

    2008-06-07 09:36:00
  • mysql 导出CSV文件 并带表头的方法

    2024-01-21 20:40:35
  • 使用Protocol Buffers的C语言拓展提速Python程序的示例

    2022-12-04 08:46:20
  • Oracle 的入门心得 强烈推荐

    2009-05-24 19:55:00
  • Python中使用HTMLParser解析html实例

    2023-01-17 11:47:16
  • python 工具类之Queue组件详解用法

    2023-08-05 23:59:10
  • python实现视频读取和转化图片

    2023-09-25 08:23:22
  • Qt Quick QML-500行代码实现合成大西瓜游戏

    2023-09-22 22:13:07
  • Navicat15安装教程超详细步骤(最靠谱)

    2024-01-12 22:29:11
  • vue3中路由传参query、params及动态路由传参详解

    2023-07-02 16:58:29
  • flask 使用 flask_apscheduler 做定时循环任务的实现

    2023-02-27 21:21:23
  • Python打包方法Pyinstaller的使用

    2022-06-08 13:25:21
  • Python Matplotlib绘制箱线图的全过程

    2023-12-03 21:37:39
  • 安装pytorch时报sslerror错误的解决方案

    2022-01-01 05:20:53
  • WEB标准与XHTML 1.0 Transitional等文档类型介绍

    2007-10-20 21:18:00
  • SqlServer 在事务中获得自增ID的实例代码

    2024-01-24 19:27:36
  • 如何实现某一页面只让特定的用户浏览?

    2010-05-19 21:44:00
  • vue+axios+java实现文件上传功能

    2024-04-30 10:40:32
  • Python 读取xml数据,cv2裁剪图片实例

    2021-07-18 00:08:08
  • asp之家 网络编程 m.aspxhome.com