/** * 频率控制 返回函数连续调用时,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";