Javascript 去Bouncing:如果内部变量总是真实的,它是如何工作的

Javascript 去Bouncing:如果内部变量总是真实的,它是如何工作的,javascript,Javascript,我试图理解去盎司函数是如何工作的。当我试图理解时,我在其中添加了一些日志语句,timeoutId似乎总是有一个值。如果我设置一个setTimeout并将其分配给一个变量,那么即使我清除了超时,该变量似乎总是真实的: let foo = setTimeout(() => { console.log(""); },5000); clearTimeout(foo); foo // some Number value !!foo // true 所以对于这个去盎

我试图理解去盎司函数是如何工作的。当我试图理解时,我在其中添加了一些日志语句,
timeoutId
似乎总是有一个值。如果我设置一个setTimeout并将其分配给一个变量,那么即使我清除了超时,该变量似乎总是真实的:

let foo = setTimeout(() => {
   console.log("");
},5000);

clearTimeout(foo);

foo   // some Number value
!!foo // true
所以对于这个去盎司函数,它让我很困惑,它到底在做什么

function debounce(fn, delay) {
   
    let timeoutId;

    return function(...args) {
        console.log("timeout id is " , timeoutId);
        if (timeoutId) {
           clearTimeout(timeoutId)
        }
        timeoutId = setTimeout(() => {
           fn(...args)
        }, delay)
    }
}

timeoutId在调用函数的第一次时不会有值,但这是由


逻辑是:

  • 停止以前的任何尝试
  • 现在在延迟秒内完成此操作
因此,如果单击一次(假设函数是通过单击调用的),那么延迟几秒钟之后,事情就会发生


但是,如果您单击一次(它将启动计时器),然后快速再次单击:它将取消计时器,以便在第一次单击后延迟几秒钟,事情不会发生(但它也会启动一个新计时器,以便在第二次单击后延迟几秒钟,将发生事件,除非有第三次单击…等等。).

您可以在完成一次调用后启动多个调用,并处理单击示例,将其他调用提交给fn,并将此fn作为参数传递。如果需要,此调用将返回其他函数。

您不确切了解哪一部分?我假设rest运算符和fn调用?@EugenSunic不,我得到了这一部分…我不知道如何timeoutId,则会达到de>clearTimeouttruthy@MauirceA-
if(truthy)
运行
if
中的任何内容,因此
clearTimeout
将始终运行(第一次没有超时时除外)。清除超时不会清除变量。添加
timeoutId=null
清除超时(timeoutId)下面的行也将变量设置为
null
。谢谢昆汀…我想我的误解是当setTimeout被触发时。我认为
首先
点击会设置超时,然后所有后续的都必须被忽略,直到setTimeout被执行。我不明白如果setTimeout没有完成,任何子事件都会发生ent单击将“重置”它。@Quentin你能帮我吗?通过这篇文章,我的帐户已被限制。并显示此会议“你已达到问题限制”“对不起,我们不再接受来自此帐户的问题。有关详细信息,请参阅帮助中心。”