立即执行版,意思是触发事件后函数会立即执行,然后 n 秒内不触发事件才能继续执行函数。
function debounce(func,wait){
let timeout
let self=this //为了保证下面箭头函数中的this指向不受影响
let args = arguments;
return function(){
if(timeout) clearTimeout(timeout)
var callNow = !timeout;
console.log(callNow)
if (callNow) func.apply(self, args)
timeout = setTimeout(() => {
timeout = null;
}, wait)
}
//刚开始timeout为undefined,callNow值为true,进入了判断,执行了一次func,所以会执行第一次点击的函数,然后进入定时器,在定时器执行完之后timeout才会为null,否则timeout一直都有settimeout的值
// callNow就为false,一直都进不去判断,一直都不执行函数,直到定时器执行完
}
非立即执行版,意思是触发事件后函数不会立即执行,而是在 n 秒后执行,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。
function debounce(fn,time){
var timer=null;
return function(){
//清除上一次延时器
clearTimeout(timer);
//重新设置新的延时器,每次点击都会清空定时器,重启一个定时器,所以只会触发最后一次func函数
timer=setTimeout(function(){
console.log(this)
fn.apply(this);//将传进的fn的this指向window,并执行fn
},time);
}
}
使用方法
function add(){
document.getElementById("count").innerHTML=num++
console.log("触发了");
}
document.getElementById("btn").onclick=debounce(add,1000);