目的
限制函数执行次数,防止请求过多
防抖
通过settimeout的方式,在一定时间间隔内,将多次触发变成一次触发
通过t是否为null来判断是否为第一次点击,若是第一次点击则直接调用函数,若不是则设置t的延时置空。
两个小点:通过apply让被调函数指针指向正确的方向
用apply来传递arguments数组
btn.addEventListener('click', debounce(submit, 2000), false)
function submit(e) {
console.log('我调用了')
}
function debounce(fn, timer) {
var t = null;
return function () {
var firstClick = !t
if (t) { clearTimeout(t) } //如果t有值清除上一次的计时器
if (firstClick) { //若t无值,是第一次,直接执行
fn.apply(this.arguments)
}
t = setTimeout(() => { //用以在一段时间后再次让其为第一次执行
t = null;
}, timer)
}
}
节流
减少一段时间的触发频率
通过时间差来判断是否点击成功,每一次点击都更新时间,点击太快,时间差太小就不通过。通过后要重置开始时间点
function throttle(fn,delay){
var begin=0
return function(){
var cur =new Date().getTime(); //记录当前点击时间
if(cur-begin>delay){ //当前时间-开始时间大于延迟,执行函数并更新
fn.apply(this.arguments)
begin=cur //更新开始时间
}
}
}