全部 android asp.net C/C++ cshap IOS Java javascript nodejs perl php python ruby web容器 其他 前端 数据库 第三方平台 混合式APP 网络 系统 默认分类

underscore.js中的节流函数debounce及trottle

0 85

函数节流   throttle and debounce的相关总结及想法

一开始函数节流的使用场景是:放止一个按钮多次点击多次触发一个功能函数,所以做了一个clearTimeout setTimeout函数

clearTimeout(cancelTimer);
cancelTimer =setTimeout(function(){
    switchControl.switchAciontFactory(view, conf);
},300)
代码的意思就不做多说了,javascript">实际上我无意间实现了一个debounce在underscore.js中对于节流函数有两种定义trottle:若定义初始间隔100ms,多次触发事件只会触发初始的那一次,事件会与第一次触发的100ms后调起debounce:对于间隔时间内100ms内发生的调起事件,会不断重置setTimeout的时间下面来一段trorrle的源码
_.throttle = function(func, wait, options) {
  var context, args, result;
  var timeout = null;
  // 上次执行时间点
  var previous = 0;
  if (!options) options = {};
  // 延迟执行函数
  var later = function() {
    // 若设定了开始边界不执行选项,上次执行时间始终为0
    previous = options.leading === false ? 0 : _.now();
    timeout = null;
    result = func.apply(context, args);
    if (!timeout) context = args = null;
  };
  return function() {
    var now = _.now();
    // 首次执行时,如果设定了开始边界不执行选项,将上次执行时间设定为当前时间。
    if (!previous && options.leading === false) previous = now;
    // 延迟执行时间间隔
    var remaining = wait - (now - previous);
    context = this;
    args = arguments;
    // 延迟时间间隔remaining小于等于0,表示上次执行至此所间隔时间已经超过一个时间窗口
    // remaining大于时间窗口wait,表示客户端系统时间被调整过
    if (remaining <= 0 || remaining > wait) {
      clearTimeout(timeout);
      timeout = null;
      previous = now;
      result = func.apply(context, args);
      if (!timeout) context = args = null;
    //如果延迟执行不存在,且没有设定结尾边界不执行选项
    } else if (!timeout && options.trailing !== false) {
      timeout = setTimeout(later, remaining);
    }
    return result;
  };
};
javascript hljs">javascript"> 

它实际上是通过一个计算,每次触发这个函数的时候获取当前时间,通过与上次存取的时间作对比,计算差值,动态设置setimeout的值,但实际个人觉得做一个阻断log就ok

function throttle(fuc,wait){
        if(typeof(changeLog) == 'undefined'){
            setTimeout(fuc,wait)
            window.changeLog = true
        }
}

当然弊端不言而喻,全局声明的变量污染

再去观看debounce的源码,相同的做法但是很奇怪的是,他没有果断重置setTimeout的时间,而是通过时间差值的加减,反正没看出有什么好处。。。

热忱回答0

  • 加入年费大会员(20每年)
  • 热门标签

    猜你喜欢

    1. JS为网页添加文字水印【原创】
    2. 原生JS+Canvas实现五子棋游戏
    3. javascript发送请求时设置代理(指定)IP
    4. Ajax.BeginForm()知多少
    5. 分页简单的封装SSM+easyUi
    6. 用9种办法解决 JS 闭包经典面试题之 for 循环取 i
    7. npm 使用小结
    8. jQuery学习之路(5)- 简单的表单应用
    9. 前端MVC学习总结(一)——MVC概要与angular入门、模板与数据绑定
    10. Angular企业级开发(5)-项目框架搭建

    衣食父母

    最近热帖

    1. 不带插件 ,自己写js,实现批量上传文件及进度显示 5
    2. 连载《一个程序猿的生命周期》-《发展篇》 - 10.欠薪的高薪和稳定的相对低薪,你会选择哪个? 6
    3. android网页分享到朋友圈问题求助? 6
    4. vue实现标签云效果 6
    5. 如何在前端模版引擎开发中避免使用eval函数 6
    6. 从String类型字符串的比较到StringBuffer和StringBuilder 6
    7. php利用gd实现图片的边框 6
    8. 谈谈java中遍历Map的几种方法 7
    9. angular之$watch、$watchGroup、$watchCollection 7
    10. ASP.NET MVC5(五):身份验证、授权 7

    随机文章

    1. DefaultResouceLoader的设计
    2. 分布式架构从零开始========》【基于Java自身技术实现消息方式的系统间通信】
    3. 4.2.1 网络请求之HTTP
    4. 使用poi读取word2007(.docx)中的复杂表格
    5. 彻底征服 Spring AOP 之 实战篇