/**
* 频率控制 返回函数连续调用时,fn 执行频率限定为每多少时间执行一次
* @param {Function} fn 需要调用的函数
* @param {Number} delay 延迟时间,单位毫秒
* @param {Boolean} immediate 给immediate参数传递false绑定的函数先执行,而不是delay后后执行。
* @param {Boolean} debounce 是否使用debounce
* @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 {Function} fn 要调用的函数
* @param {Number} delay 空闲时间
* @param {Boolean} immediate 给immediate参数传递false绑定的函数先执行,而不是delay后执行。
* @return {Function} 实际调用函数
*/
var debounce = function(fn, delay, immediate) {
return throttle(fn, delay, immediate, true);
}版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
关注微信公众号:"cq_xifan";