函数抖动: 不断触发事件会不断的执行某个方法
函数防抖: 当事件在不断的触发,等待停下来之后 会执行一次
举个栗子: 比如煮饭,整个过程在加热(好比 不断触发事件),只有电饭煲跳了之后(好比 事件触发停下来),就可以吃饭了(执行某个方法)
var timer = null
function fangdou(await) {
if (timer) {
// 只要事件一触发,初回清除上一次的定时器,定时器清除了,
// 就不会执行定时器里面的代码,也就会中断上一次准备执行的代码
clear(timer)
}
timer = setTimeout(()=>{
console.log('我滚动了')
},await)
}
函数节流: 当事件不断触发,不会马上执行,二是到了规定时间后执行就执行一次,说白了就是降低执行频率,当事件触发结束,就不会再执行
举个栗子: 好比口罩生产机器,开启电源后就开始工作(事件不断触发), 假设每10秒生产一个口罩(生产口罩就是 执行某个方法),当电源关闭后就不再 生产口罩
function fn() {
console.log('我滚动了')
}
function jieliu(delay,fn) {
var beginTime = Date.now()
console.log('我在开始会执行一次,在滚动中不会被触发',beginTime)
return function() {
var currentTime = Data.now
if (currentTime- beginTime > delay) {
fn()
// 重置 beginTime
beginTime = Date.now()
}
}
}
window.onscroll = jieliu(1000, fn) // 执行的是 return 后的函数,而不是jieliu函数,
// 因为 window.onscroll = 函数名 或 匿名函数
// 值得注意的是 beginTime 一直还在内存中
函数防抖与函数节流的区别: 函数防抖只有在事件
触发停下来
之后会触发,整个过程只触发一次。
函数节流,说白了就是事件触发过程中(如:滚动中)
降低方法的执行频率,在规定时间范围内会触发一次,在整个过程中(指的是到事件触发结束 可能会触发多次,触发结束后不再执行