我创建了一个 debounce 函数,代码如下:
function debounce(func, timeout = 300) { let timer; return (...args) => { if (timer) clearTimeout(timer); timer = setTimeout(() => { func.apply(this, args); }, timeout); };
现在我在搜索栏的 onChange 事件中使用它。
search.addEventListener("input", (e) => { eventCount++; eventOutput.textContent = eventCount; debounce(() => { apiRequestCount++; apiCount.textContent = apiRequestCount; }, 200); });
但这不起作用,但是当我使用以下代码时它起作用了。
const debouncedFunction = debounce(() => { apiRequestCount++; apiCount.textContent = apiRequestCount; }, 200); search.addEventListener("input", (e) => { eventCount++; eventOutput.textContent = eventCount; debouncedFunction(); });
我无法弄清楚为什么它的行为是这样的,两者几乎相同,在第二个中,我只将 debounce 函数存储在 const 中。
debounce 函数返回另一个函数,您可以将其视为类的对象(它具有计时器的“内存”,即 setTimeout id),并且您始终调用使用 debounce() 函数创建的相同函数。但是在第一个示例中,您在每个输入事件上都创建了新的去抖动函数,这会创建新对象而不知道先前的超时。
您不仅将其存储在 const 中,还将 debounced 函数 deplaration 从事件侦听器中移出并仅开始创建一次。
相反,在第一个示例中,您正在为每个“输入”事件创建新的去抖动函数