函数节流与防抖
函数防抖(debounce)
函数防抖的定义
事件触发,等待一段时间,假如事件在时间内不再触发,则调用函数,假如触发重新计算时间.
原理
设置定时器为null,假如定时器存在则清空,再设置新的定时器,事件结束后触发函数,并清空定时器.
代码
function debounce(fn,wait){
let timer = null;
return ()=>{
if(timer){
clearTimeout(timer);
}
timer = setTimeout(()=>{
fn()
timer = null
},wait)
}
}
应用场景
- 每次resize或者scroll触发统计事件
- 文本输入调用ajax
函数节流(throttle)
函数节流的定义
一段时间内只能调用一次函数(技能CD)
原理
使用时间戳来判断是否到回调执行时间,记录上次执行时间,当当前时间与上次执行时间间隔大于时间戳则执行回调.
设置状态doing,触发事件,状态变为true,一段时间后变为false.只有状态为false才回调函数.
代码
//实现方式1
function throttle(fn,gapTime){
let lastTime = 0;
return ()=>{
let currTime = new Date();
if(currTime - lastTime > gapTime || !lastTime){
fn();
lastTime = currTime
}
}
}
//实现方式2
function throttle(fn,gapTime){
let doing = false;
return ()=>{
if(doing === false){
fn()
doing = true
setTimeout(()=>{
doing = false
},gapTime)
}
}
}
应用场景
- DOM元素拖动
- Canvas
- 计算鼠标移动距离
- 自动联想
- 滚动到底部加载数据
版权声明:本博客所有文章除特殊声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明出处 Roxas Deng的博客!