1 /** 2 * 频率控制 返回函数连续调用时,fn 执行频率限定为每多少时间执行一次 3 * @param {Function} fn 需要调用的函数 4 * @param {Number} delay 延迟时间,单位毫秒 5 * @param {Boolean} immediate 给immediate参数传递false绑定的函数先执行,而不是delay后后执行。 6 * @param {Boolean} debounce 是否使用debounce 7 * @return {Function} 实际调用函数 8 */ 9 var throttle = function(fn, delay, immediate, debounce) { 10 var curr = +new Date(), //当前事件 11 last_call = 0, 12 last_exec = 0, 13 timer = null, 14 diff, //时间差 15 context, //上下文 16 args, 17 exec = function() { 18 last_exec = curr; 19 fn.apply(context, args); 20 }; 21 return function() { 22 curr = +new Date(); 23 context = this, 24 args = arguments, 25 diff = curr - (debounce ? last_call : last_exec) - delay; 26 clearTimeout(timer); 27 if (debounce) { 28 if (immediate) { 29 timer = setTimeout(exec, delay); 30 } else if (diff >= 0) { 31 exec(); 32 } 33 } else { 34 if (diff >= 0) { 35 exec(); 36 } else if (immediate) { 37 timer = setTimeout(exec, -diff); 38 } 39 } 40 last_call = curr; 41 } 42 }; 43 44 /** 45 * 空闲控制 返回函数连续调用时,空闲时间必须大于或等于delay,fn才会执行 46 * @param {Function} fn 要调用的函数 47 * @param {Number} delay 空闲时间 48 * @param {Boolean} immediate 给immediate参数传递false绑定的函数先执行,而不是delay后执行。 49 * @return {Function} 实际调用函数 50 */ 51 var debounce = function(fn, delay, immediate) { 52 return throttle(fn, delay, immediate, true); 53 }