JS 防抖与节流的思路与实现
防抖
抖动 (和硬件上按键抖动类似)描述的是一种高频事件,但不需要每次都响应
例如:对输入内容的动态提示,要监听oninput 但打字会高频触发这个事件
简单的防抖实现
let t = null;
inp.oninput = function() {
if (t !== null) {
clearTimeout(t) // 当用户输入的停顿超过设定的500ms时,延时的任务才会进入任务队列并执行
}
t = setTimeout(() => {
// 延时执行的内容
}, 500)
}
用闭包封装防抖
function debounce(callback, delay) {
let t = null;
return function() {
if (t !== null) {
clearTimeout(t) // 当用户输入的停顿超过设定的500ms时,延时的任务才会进入任务队列并执行
}
t = setTimeOut(() => {
// 延时执行的内容
callback.call(this); // 改变回调的this指向,方便获取事件相关值
}, delay)
}
}
节流
节流 同样是处理高频事件,要求的是一段时间内仅执行一次
差别:最终响应的事件是第一次触发的
后续的高频事件会被空过,理解成 截流 似乎也挺合理
节流的简单实现
let firstFlag = true
window.onscroll = function () {
if (firstFlag) {
setTimeout(() => {
// 需要执行的响应
firstFlag = ture; // 执行完响应后,要恢复处理
}, 500)
}
firstFlag = false; // 后续的事件将空过
}
对齐封装
function throttle(callback, delay) {
let firstFlag = true
return function () {
if (firstFlag) {
setTimeout(() => {
// 需要执行的响应
callback.call(this)
firstFlag = ture; // 执行完响应后,要恢复处理
}, delay)
}
firstFlag = false; // 后续的事件将空过
}
}
内容会不断更新,欢迎批评指正。
分类:
# JavaScript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)