别抖了(防抖函数)
发表于:2024-12-10
字数统计:842 字
预计阅读3分钟
介绍
在平时的网页交互中,常常会有一些高频操作的场景,比如:
- 登录、发短信等按钮避免用户点击太快,以致于发送了多次请求。
- 调整浏览器窗口大小时,resize 次数过于频繁,造成计算过多。
- 文本编辑器实时保存。
上面这些场景在实际交互中会不断地调用绑定在事件(如:浏览器的 resize、scroll、keypress、mousemove 等)上的回调函数,极大地浪费资源,降低前端性能。为了优化体验,需要对这类事件进行调用次数的限制,对此我们就可以采用防抖(debounce)的方式来减少调用频率。
来看一下防抖的定义:n 秒后再执行某个函数,若该函数在 n 秒内被重复触发,则重新计时。
用一个比喻来说明就是:比如坐电梯,把电梯完成一次运送看作是一次函数的执行过程,那么电梯门关上的那一刻,则为开始执行函数的标志。假设电梯从检测到有人进入到关门之间的等待时间为 15 秒,不考虑容量限制,电梯第一个人进来后,等待 15 秒。如果过程中又有人进来,15 秒等待重新计时,直到最后检测到有人进入,并在之后的 15 秒内不再有人进入才会开始运送。
准备
本题已经内置了初始代码,打开实验环境,目录结构如下:
txt
├── debounce.js
└── index.html其中:
index.html是主页面。debounce.js是待补充的 js 文件。
目标
补充文件 debounce.js 中的 debounce 工具函数,使其实现我们需要的功能:

- 接收一个函数以及延迟时间,并返回一个防抖函数。
- 即使函数在 delay 时间段内多次被调用,也只会在最后一次函数被调用的 delay 时间结束后执行。
- 防抖函数需要考虑传参情况。
在输入框中输入不同的查询参数时,页面效果如下(只会在停止输入后,延迟 500ms 才输出内容):

规定
- 题目使用 JavaScript 完成,不得使用第三方库。
- 只能在
debounce.js中指定区域答题,不能修改index.html中的任何代码。 - 请不要修改环境自动生成的
debounce.js以及index.html文件的文件路径以及文件名。 - 检测时使用的输入数据与给出的示例数据可能是不同的。考生的程序必须是通用的,不能只对需求中给定的数据有效。
判分标准
- 本题完全实现题目目标得满分,否则得 0 分。
总通过次数: 865 | 总提交次数: 937 | 通过率: 92.3%
难度: 中等 标签: 蓝桥杯备赛练习题, 2022, 省模拟赛, Web 前端, JavaScript
题解
js
function debounce(fn, delay = 0) {
let timer = null;
const debounceFn = function (...args) {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(() => {
fn.call(this, ...args);
clearTimeout(timer);
}, delay);
};
return debounceFn;
}
module.exports = debounce; // 检测需要,请勿删除