/** * * @param func {Function} 实际要执行的函数 * @param wait {Number} 执行间隔,单位是毫秒(ms),默认1000ms * @param wait {Object} leading 前置执行 * @return {Function} 返回一个“节流”函数 */ export function throttle(func, wait = 1000, leading = true) { // 利用闭包保存定时器和上次执行时间 let timer = null; let previous; // 上次执行时间 return function () { // 保存函数调用时的上下文和参数,传递给 fn const context = this; const args = arguments; const now = +new Date(); if (previous && now < previous + wait) { if (leading) return; // 周期之中 clearTimeout(timer); timer = setTimeout(function () { previous = now; func.apply(context, args); }, wait); } else { previous = now; func.apply(context, args); } }; } /** * @param func {Function} 实际要执行的函数 * @param delay {Number} 延迟时间,单位是毫秒(ms) * @return {Function} 去抖动 */ export function debounce(fn, delay = 1000) { let timer; // 返回一个函数,这个函数会在一个时间区间结束后的 delay 毫秒时执行 func 函数 return function () { // 保存函数调用时的上下文和参数,传递给func var context = this; var args = arguments; // 函数被调用,清除定时器 clearTimeout(timer); // 当返回的函数被最后一次调用后(也就是用户停止了某个连续的操作), // 再过 delay 毫秒就执行 func timer = setTimeout(function () { fn.apply(context, args); }, delay); }; }