函数去抖(debounce)
定义:
当调用动作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;
};
};