在 javascript 中,利用闭包实现节流函数的核心做法是:定义一个外层函数接收目标函数和延迟时间,内部维护一个 `timer` 变量(即闭包),每次触发时检查该变量是否为空;若为空则立即执行并记录时间,若不为空则更新定时器以推迟执行。这样通过闭包保存了上一次执行的状态,确保在指定间隔内只执行一次。

如何编写基础版节流函数
基础版节流函数通常采用“立即执行”策略,即在第一次调用时立刻执行目标函数,后续调用则重置计时器。这种实现方式适用于需要第一时间响应用户操作(如窗口调整)的场景。

function throttle(func, delay) {
let timer = null;
return function(...args) {
if (!timer) {
func.apply(this, args);
timer = setTimeout(() => {
timer = null;
}, delay);
}
};
}
上述代码中,`throttle` 函数返回一个新的匿名函数。当这个新函数被多次调用时,`timer` 变量始终指向同一个内存地址。如果 `timer` 为 `null`,说明当前处于可执行状态,于是立即调用 `func` 并开启一个定时器。定时器结束后将 `timer` 置为 `null`,允许下一次立即执行。
如何实现防抖式节流(最后一次执行)
另一种常见的节流模式是“最后一次执行”,即忽略中间的所有调用,只在停止触发后的指定时间内执行一次。这适用于搜索输入框等场景,避免频繁请求接口。

function throttleLast(func, delay) {
let timer = null;
return function(...args) {
if (timer) clearTimeout(timer);
timer = setTimeout(() => {
func.apply(this, args);
timer = null;
}, delay);
};
}
在这个版本中,每次调用都会先清除现有的 `timer`,然后重新设置一个新的定时器。这意味着只要用户还在持续触发事件,之前的定时器就会被不断取消,直到用户停止操作超过 `delay` 毫秒后,才会真正执行目标函数。闭包在这里同样起到了保存 `timer` 状态的作用。
基于程序中某个输入、条件或结果的具体问题
在实际使用中,如果目标函数需要传递参数,闭包必须能够正确捕获这些参数。例如,当使用箭头函数作为回调时,`this` 的指向可能会发生变化,导致 `apply` 失效。此时应确保返回的函数能正确绑定上下文,或者使用普通函数声明来保留 `this` 的动态绑定特性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











