export default function debounce(fn, interval = 500, immediate = false) { //fn为要执行的函数 //interval为等待的时间 //immediate判断是否立即执行 var timeout; //定时器 return function() { //返回一个闭包 var context = this, args = arguments; //先把变量缓存 var later = function() { //把稍后要执行的代码封装起来 timeout = null; //成功调用后清除定时器 if (!immediate) fn.apply(context, args); //不立即执行时才可以调用 }; var callNow = immediate && !timeout; //判断是否立即调用,并且如果定时器存在,则不立即调用 clearTimeout(timeout); //不管什么情况,先清除定时器,这是最稳妥的 timeout = setTimeout(later, interval); //延迟执行 if (callNow) fn.apply(context, args); //如果是第一次触发,并且immediate为true,则立即执行 } }