Javascript 这是怎么回事;延迟“;函数工作

Javascript 这是怎么回事;延迟“;函数工作,javascript,Javascript,我用这个代码来包装代码的一部分,它是这样使用的 var delay = (function() { // SET TIMER var timer = 0; // RETURN SET TIMEOUT FUNCTION return function(callback, ms) { clearTimeout(timer); timer = setTimeout(callback, ms); }; })();​ delay(f

我用这个代码来包装代码的一部分,它是这样使用的

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);
我这样叫它,

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毫秒,但我不明白发生了什么,谢谢:)

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

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

function(callback, ms) {
   clearTimeout(timer);
   timer = setTimeout(callback, ms);
}
由于它处于关闭状态,因此该内部函数可以访问
定时器
变量。没有其他外部代码可以访问计时器。此方法用于允许多个计时器同时运行,而不必担心多个
计时器
变量

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


然后在第一段代码中调用
delay(callback,timeout)

调用该内部函数,生成一个为delay的变量,并将if赋值给函数的返回值..,该函数返回一个

return function(callback, ms) {
        clearTimeout(timer);
        timer = setTimeout(callback, ms);
    }
这实际上是你的延迟变量 所以当你把它叫做

delay(function() {
     .......
}, 1000);
此wud按预期工作。

还要注意
()
在末尾,你分配了
delay
变量。在javascript中,这意味着一遇到函数就立即运行。因此,当我看到的第一部分代码运行时,
delay
变量被分配了一个函数。你在第二段代码中调用该函数时,

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

var delay;
var timer = 0;
delay = function(callback, ms) {
    clearTimeOut(timer);
    timer = setTimeout(callback, ms);
}
您现在遇到的问题是,如果两次调用delay,它将覆盖计时器变量,因此第二次延迟将覆盖计时器变量。我对此进行了测试,似乎您的函数也被破坏了,应该是:

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,因为第一个将覆盖计时器变量


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

我建议您在上询问,看看和。您可能还想看看匿名函数定义。这是一个。谢谢。这对我帮助很大!