zoukankan      html  css  js  c++  java
  • js 函数节流 jQuery throttle/debounce

    在《JavaScript高级程序设计》一书有介绍函数节流,里面封装了这样一个函数节流函数:

     function throttle(method, context) {
         clearTimeout(methor.tId);
         method.tId = setTimeout(function(){
             method.call(context);
         }, 100);
     }
    

    它把定时器ID存为函数的一个属性。而调用的时候就直接写

    window.onresize = function(){
        throttle(myFunc);
    }
    

    impress用的是另一个封装函数:

     var throttle = function(fn, delay){
     	var timer = null;
     	return function(){
     		var context = this, args = arguments;
     		clearTimeout(timer);
     		timer = setTimeout(function(){
     			fn.apply(context, args);
     		}, delay);
     	};
     };
    

    它使用闭包的方法形成一个私有的作用域来存放定时器变量timer。而调用方法为

    window.onresize = throttle(myFunc, 100);
    

    两种方法各有优劣,前一个封装函数的优势在把上下文变量当做函数参数,直接可以定制执行函数的this变量;后一个函数优势在于把延迟时间当做变量(当然,前一个函数很容易做这个拓展),而且个人觉得使用闭包代码结构会更优,且易于拓展定制其他私有变量,缺点就是虽然使用apply把调用throttle时的this上下文传给执行函数,但毕竟不够灵活。

    上面介绍的函数节流,它这个频率就不是50ms之类的,它就是无穷大,只要你能不间断resize,刷个几年它也一次都不执行处理函数。我们可以对上面的节流函数做拓展:

     var throttleV2 = function(fn, delay, mustRunDelay){
     	var timer = null;
     	var t_start;
     	return function(){
     		var context = this, args = arguments, t_curr = +new Date();
     		clearTimeout(timer);
     		if(!t_start){
     			t_start = t_curr;
     		}
     		if(t_curr - t_start >= mustRunDelay){
     			fn.apply(context, args);
     			t_start = t_curr;
     		}
     		else {
     			timer = setTimeout(function(){
     				fn.apply(context, args);
     			}, delay);
     		}
     	};
     };
    

    在这个拓展后的节流函数升级版,我们可以设置第三个参数,即必然触发执行的时间间隔。如果用下面的方法调用

    window.onresize = throttleV2(myFunc, 50, 100);
    

    则意味着,50ms的间隔内连续触发的调用,后一个调用会把前一个调用的等待处理掉,但每隔100ms至少执行一次。原理也很简单,打时间tag,一开始记录第一次调用的时间戳,然后每次调用函数都去拿最新的时间跟记录时间比,超出给定的时间就执行一次,更新记录时间。

  • 相关阅读:
    缓存算法之LRU与LFU
    银行家算法
    死锁,死锁的四个必要条件以及处理策略
    找出无序数组中位数的方法
    HTTP状态码
    进程调度算法
    宽字节wchar_t和窄字节char的相互转换
    胜天半子
    ? 题目 一道超难的奥数题,猜生日. A告诉B他生日的月份,告诉C他生日的日期 B说:“如果我不知道A的生日,那C肯定也不知道." C说:”本来我不知道,现在我知道了.“ B说:”哦,那我也知道了.
    有对夫妇生有一男一女,一天晚上,成员中的一个杀了另一个,剩下2个成员,1个是帮凶1个是目击者
  • 原文地址:https://www.cnblogs.com/richardcastle/p/8297403.html
Copyright © 2011-2022 走看看