function delayFn2 (fn, delay, mustDelay){ var timer = null; var t_start; return function(){ var context = this, args = arguments, t_cur = +new Date(); //先清理上一次的调用触发(上一次调用触发事件不执行) clearTimeout(timer); //如果不存触发时间,那么当前的时间就是触发时间 if(!t_start){ t_start = t_cur; } //如果当前时间-触发时间大于最大的间隔时间(mustDelay),触发一次函数运行函数 if(t_cur - t_start >= mustDelay){ fn.apply(context, args); t_start = t_cur; } //否则延迟执行 else { timer = setTimeout(function(){ fn.apply(context, args); }, delay); } }; } var count=0; function fn1(){ count++; console.log(count) } //100ms内连续触发的调用,后一个调用会把前一个调用的等待处理掉,但每隔200ms至少执行一次 document.onmousemove=delayFn2(fn1,100,200)