函数防抖


1.题目描述

请你编写一个函数,接收参数为另一个函数和一个以毫秒为单位的时间 t ,并返回该函数的 函数防抖 后的结果。

函数防抖 方法是一个函数,它的执行被延迟了 t 毫秒,如果在这个时间窗口内再次调用它,它的执行将被取消。你编写的防抖函数也应该接收传递的参数。

例如,假设 t = 50ms ,函数分别在 30ms 、 60ms 和 100ms 时调用。前两个函数调用将被取消,第三个函数调用将在 150ms 执行。如果改为 t = 35ms ,则第一个调用将被取消,第二个调用将在 95ms 执行,第三个调用将在 135ms 执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
var debounce = function (fn, t) {
// 定义一个定时器 timeoutID ,保存上一个函数调用时生成的定时器 timeoutID
let timeId = null;
return function (...args) {
// 当防抖函数再次被调用时,判断上次定时器 timeoutID 是否存在,存在表示在窗口内再次调用,则更新延迟调用时间
// 如果 timeoutID 不存在,表示在窗口外调用,将生成的 timeoutID 赋值给 timeId,用于下次调用判断是否在窗口内
// 一句话总结,如果调用函数在窗口内,则取消上次调用,并设置新的延迟调用;在窗口外则直接设置延迟调用并保存 timeoutID
if (timeId) clearTimeout(timeId);
timeId = setTimeout(() => {
fn(...args);
}, t);
};
};