定义: 当调用动作n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间。
/**函数去抖 */ // _.debounce = function(func, wait, immediate) { //js中单独定义方法的写法 export function debounce (func, wait, immediate) { // immediate默认为false let timeout, args, context, timestamp, result; const later = function() { // 当wait指定的时间间隔期间多次调用_.debounce返回的函数,则会不断更新timestamp的值, //导致last < wait && last >= 0一直为true,从而不断启动新的计时器延时执行func //距离上一次触发时间间隔 var last = +new Date() - timestamp; //上次被包装函数被调用时间间隔last小于设定时间间隔wait if (last < wait && last >= 0) { timeout = setTimeout(later, wait - last); } else { timeout = null; //如果设定为immediate===true,因为开始边界已经调用过了,无需调用 if (!immediate) { result = func.apply(context, args); if (!timeout) context = args = null; } } }; return function (...args) { console.log(func.apply(context, args)) context = this; args = arguments; timestamp = +new Date() // 第一次调用该方法时,且immediate为true,则调用func函数 const callNow = immediate && !timeout; // 在wait指定的时间间隔内首次调用该方法,则启动计时器定时调用func函数 //如果延时不存在,重新设定延时 if (!timeout) timeout = setTimeout(later, wait); if (callNow) { result = func.apply(context, args); context = args = null; } return result; }; };