这个“延迟”功能是如何工作的

How does this "delay" function works

本文关键字:工作 何工作 延迟 功能 这个      更新时间:2023-09-26

我正在使用此代码将部分代码包装在其中,它是这样使用的,

var delay = (function() {
    // SET TIMER
    var timer = 0;
    // RETURN SET TIMEOUT FUNCTION
    return function(callback, ms) {
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    };
})();​

我这样称呼它,

delay(function() {
     .......
}, 1000);

它会延迟 1000 毫秒,但我不明白发生了什么,谢谢:)

延迟是一个将返回另一个函数的函数。计时器变量位于延迟函数的闭包内,因此返回函数仍然可以访问它。函数。你也可以这样写

var delay;
var timer = 0;
delay = function(callback, ms) {
    clearTimeOut(timer);
    timer = setTimeout(callback, ms);
}

您现在遇到的问题是,如果您调用延迟两次,它将覆盖计时器变量,因此第二次延迟将覆盖计时器变量。我对此进行了测试,似乎您的函数也损坏了,应该是:

var delay = function(){
// SET TIMER
    var timer = 0;
// RETURN SET TIMEOUT FUNCTION
    return function(callback, ms){
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    };
};
delay()(function(){console.log("hello1");}, 5000);
delay()(function(){console.log("hello2");}, 5000);

如果你的代码做同样的事情,它只会跟踪hello2,因为第一个将覆盖计时器变量。

除非您的意图是第二次延迟将停止第一次延迟,否则您应该使用不同的应用程序。

这段代码做的第一件事就是执行这个函数(感谢你发布的代码末尾的()):

function() {
    // SET TIMER
    var timer = 0;
    // RETURN SET TIMEOUT FUNCTION
    return function(callback, ms) {
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    };
}​

并将结果存储在delay 中。执行时,此函数使用局部变量 timer 创建一个闭包,该变量作为局部计数器服务器化。然后,该函数返回内部函数:

function(callback, ms) {
   clearTimeout(timer);
   timer = setTimeout(callback, ms);
}

由于它是闭包的,因此此内部函数可以访问timer变量。没有其他外部代码可以访问timer 。此方法用于允许同时运行多个计时器,而不必担心多个timer变量。

想象一下:delay现在包含一个函数(function(callback, ms) {...),可以访问局部变量timer。就任何外部代码而言,变量timer是不可见的。只有delay包含的函数才能访问它。

然后,通过调用 delay(callback, timeout) 来调用该内部函数。

在第

一段代码中,你创建一个延迟变量,并将if分配给函数的返回值。

return function(callback, ms) {
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    }

所以这实际上是你的延迟变量。 西北所以当你这样称呼它时.

delay(function() {
     .......
}, 1000);

这个 wud 工作如预期的那样..
还要注意末尾的(),其中 u assing delay变量。在JavaScript中,这意味着在遇到函数时立即运行它。因此,当我看到代码的第一部分运行时,它被运行delay变量被分配了一个函数。你在第二段代码中调用了哪个