在下面的throttle
函数中,timeout
最终会变成一个数字,因为它被分配给了setTimeout。我将它重新定义为false
,因为它被清除了,代码正常工作。
我没有注意到表面上的任何东西,但想知道这样做是否有任何问题,或者我可能遗漏了什么?
const throttle = (fn, delay) => {
let timeout;
return (...args) => {
if(!timeout) {
timeout = setTimeout(() => {
fn(...args);
clearTimeout(timeout = false);
}, delay);
}
}
};
代码:
clearTimeout(timeout = false)
评估为:
timeout = false;
clearTimeout(timeout)
这意味着您调用clearTimeout(false)
,但这是不正确的。应使用setTimeout()
返回的超时ID来调用clearTimeout()
。
它似乎有效,因为您从超时到期时执行的函数中调用clearTimeout()
。对clearTimeout()
的调用不起作用,但超时已经过期,JavaScript无论如何都会清除它。
不需要从超时回调调用clearTimeout()
,也没有帮助。clearTimeout()
的作用是在超时到期之前调用它,以防止执行使用setTimeout()
设置的回调。
您的代码应该是:
timeout = setTimeout(() => {
fn(...args);
timeout = false;
}, delay);