网站首页 > 技术文章 正文
说到防抖和节流相信大家都不陌生,这两个东西大家可能多多少少都有用到过,最少也有听过
古人云,温故而知新。虽然可能已经很熟悉防抖和节流了,但不妨再看一看巩固一下知识
什么?你说你不仅不会手写防抖和节流,也没有听过。那也没事,下文会详细介绍的
防抖和节流有什么用?
简单来说,防抖和节流都是用来减少函数执行的频率,以达到优化项目性能或者实现特定功能的效果
防抖
定义:事件被触发一定时间后再执行回调。如果在这段时间内又被触发了,则重新开始计算时间
常用场景
- 输入框远程查询事件
- 在线文档自动保存
- 浏览器视口大小改变
例子
张三在某平台搜索一本书籍,发现搜索建议并不是瞬间就出现的,而是自己输入词组结束后出现的。那么该平台在此搜索框可能做了什么操作?
代码实现
<body>
<input type="text" id="searchElement" />
</body>
<script>
const searchElement = document.getElementById('searchElement');
const debounce = (fn, initial) => {
let timer = null;
return () => {
clearTimeout(timer);
timer = setTimeout(fn, initial);
};
};
searchElement.oninput = debounce(function (event) {
const value = searchElement.value;
if (value) console.log(value, '请求值');
}, 1000);
</script>
节流
定义:在单位时间内只触发一次函数,若单位时间内多次触发只有一次生效
常用场景
- 按钮提交事件(当然也可做成点击后就loading)
- 页面滚动事件的触发
- 累计计算鼠标移动距离
例子
张三参加某平台周年庆活动,他选购了某热门饮品并一直点击抢购按钮,却发现并不是每次点击都会有响应的。那么该平台前端可能做了什么限制?
代码实现
<body>
<button type="submit" id="buttonElement">抢购</button>
</body>
<script>
function throttle(fn, interval) {
let timer;
return (event) => {
if (timer) return false;
timer = setTimeout(() => {
clearTimeout(timer);
timer = null;
fn(event);
}, interval);
};
}
var btnClick = document.getElementById('buttonElement');
btnClick.addEventListener('click', throttle(function (event) {
console.log(event, '点击了')
}, 1000));
</script>
可以看到,张三疯狂点击抢购,但还是每秒只响应1次
节流(立即执行)
细心的同学可能发现了,上面这个代码有个弊端,那就是在张三第一次点击的时候也隔了1秒才响应,这不免也太坑了。正常来说第一次应该直接响应的,并且在连续点击结束后的第一次也应该立即触发,其实想实现这样的效果也不难
<body>
<button type="submit" id="buttonElement">抢购</button>
</body>
<script>
function throttle2(fn, interval) {
let init = false; // 引入一个参数记录状态
let timer;
return (event) => {
if (init) return;
init = true;
clearTimeout(timer);
timer = setTimeout(() => {
init = false;
}, interval);
fn(event);
}
}
var btnClick = document.getElementById('buttonElement');
btnClick.addEventListener('click', throttle2(function (event) {
console.log(event, '点击了')
}, 2000));
</script>
可以看到第一次点击直接打印,第二次疯狂点击只打印一次,最后一次点击也是直接打印
引入Lodash实现
GitHub地址:https://github.com/lodash/lodash
官方文档:https://www.lodashjs.com/
防抖
import _ from 'lodash';
debounceHandle: _.debounce(function() {
console.log('业务代码');
}, 2000, { // 在n毫秒内触发
leading: true, // 第一次点击立刻执行,默认为true
trailing: true // 节流结束后立刻执行,默认为true
});
节流
import _ from 'lodash';
throttleHandle: _.throttle(function() {
console.log("业务代码");
}, 2000);
文章来自https://www.cnblogs.com/rainy-night/p/16169285.html
- 上一篇: 秒懂前端防抖和节流(无需代码)
- 下一篇: 前端面试:什么是节流,在什么场景中使用
猜你喜欢
- 2025-09-11 Vue 自定义指令_vue 自定义指令实现v-bind
- 2025-09-11 为什么说 ReadableStream 是现代 Web 架构的关键拼图?
- 2025-09-11 2025前端面试题-React基础篇_前端react必读书籍推荐
- 2025-09-11 肉鸭产业养殖端是否需要升级?我们该怎么做?
- 2025-09-11 为什么你的前端首屏慢?从 TTFB 到 CLS 的系统性优化清单
- 2024-12-08 函数节流的6种应用场景,与防抖函数有什么区别?
- 2024-12-08 前端百题斩—通俗易懂的防抖与节流
- 2024-12-08 前端面试:什么是节流,在什么场景中使用
- 2024-12-08 秒懂前端防抖和节流(无需代码)
你 发表评论:
欢迎- 最近发表
-
- 用AI做微信小程序的完整步骤_如何用ai制作微信表情包
- 自习室预约的微信小程序设计与实现-计算机毕业设计源码+LW文档
- 微信小程序开发入门指南_微信小程序开发入门教程
- 写字机器人好用吗? 组装就花了5个小时 还要学习软件、录入字体
- 白描网页版 - 高效准确且免费的OCR文字识别工具
- 字体图形面板与图标字体使用_字体图标的优势和劣势
- 作为前端工程师必须懂得的33个CSS核心概念
- Flutter程序员开发炫酷的登录页面 字体库运用 路由学习 源码分享
- 2025Q3开源字体盘点:让你的代码和文档'颜值'飙升!
- Agent杂谈:Agent的能力上下限及「Agent构建」核心技术栈调研分享~
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- oracle面试 (55)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)